ios实战开发之UITableView应用(商品展示2)
1、效果演示:http://player.youku.com/player.php/sid/XNjkzNDIyMDIw/v.swf
2、过程分析:
2.1、用storyboard画出基本界面图示:
2.2、创建UITableView--(View)
2.3、从文件中读取出数据源、抽象模型对象--(Model)
2.4、设置当前控制器为数据源及UITableView的代理实现相关方法--(Control)
以上三点即ios开发的MVC模型
3、关键代码:
SACar.h
//
//SACar.h
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface SACar : NSObject
@property (nonatomic, copy) NSString *name; // 数据模型汽车名称
@property (nonatomic, copy) NSString *icon; // 数据模型汽车图片
@property (nonatomic, copy) NSString *desc; // 数据模型汽车描述
+ (id)carWithDict:(NSDictionary *)dict; // 类构造方法快速创建模型
- (id)initWithDict:(NSDictionary *)dict; // 对象构造方法快速创建模型
@end
SACar.m
//
//SACar.m
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import "SACar.h"
@implementation SACar
+ (id)carWithDict:(NSDictionary *)dict
{
return [ initWithDict:dict];
}
- (id)initWithDict:(NSDictionary *)dict
{
if (self = ) {
self.name = dict[@"name"];
self.icon = dict[@"icon"];
self.desc = dict[@"desc"];
}
return self;
}
@end
SAViewController.h
//
//SAViewController.h
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "SACar.h"
@interface SAViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITableView *tableView; // UITableView
@property (weak, nonatomic) IBOutlet UILabel *titleLable; // 标题栏,显示"汽车展示"或"已选择n个"
@property (weak, nonatomic) IBOutlet UIBarButtonItem *removeItem; // 删除按钮
- (IBAction)remove:(UIBarButtonItem *)sender; // 删除按钮事件
- (IBAction)antiElection:(UIBarButtonItem *)sender; // 反选按钮事件
@end
SAViewController.m
//
//SAViewController.m
//UITableView-3
//
//Created by yusian on 14-4-1.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import "SAViewController.h"
#define kCarCounts 20
#define kCellHeight 60
@interface SAViewController () <UITableViewDataSource, UITableViewDelegate>
{
// 两个全局可变数组,一个用来存储所有SACar对象与临时SACar对象
NSMutableArray*_cars;
NSMutableArray*_selectedCars;
}
@end
@implementation SAViewController
#pragma mark View加载完后调用
- (void)viewDidLoad
{
;
_cars = ; // 数组初始化
_selectedCars = ; // 数组初始化
self.tableView.dataSource = self; // tableview的数据源为当前控制器
self.tableView.delegate = self; // tableview的代码为当前控制器
// 用数组将文件中的内容取出,再通过模型格式化保存到全局数组_cars中,循环取值,抽象kCarCounts个对象做为数据源
NSString *path = [ pathForResource:@"Des.plist" ofType:nil];
NSArray *data = [ initWithContentsOfFile:path];
for (int i = 0; i < kCarCounts; i++) {
SACar *car = ];
;
}
}
#pragma mark 返回表格行数-UITableViewDataSource协议方法(必须实现)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// 由于该方法在表格刷新时调用,所以某此与表格刷新相关的事件处理可以放到该方法中来处理
if (_selectedCars.count) {
self.titleLable.text = ; // ToolBar上lable动态文字显示
self.removeItem.enabled = YES;// 删除按钮的可用性
} else {
self.titleLable.text = @"汽车展示";
self.removeItem.enabled = NO;
}
return _cars.count; // 返回数据源对象个数即表格行数;
}
#pragma mark 返回对应行表格内容-UITableViewTableDataSource协议方法(必须实现)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 变量定义或初始化
static NSString *ID = @"cell";
SACar *car = _cars;
UITableViewCell *cell = ;// 如果缓存中有带ID标记的cell则直接回收利用
// 如果没有,则自己初始化并做标记以备后续能循环利用
if (nil == cell) {
cell = [ initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
// 无论是缓存回收还是新创建的cell内容都必须重新赋值,循环利用只能解决是否需要新创建的问题,出发点在性能
cell.imageView.image = ; // 将模型icon数据解析到表格cell的image中
cell.textLabel.text = car.name; // 将模型name数据解析到表格cell的textLabel中
cell.detailTextLabel.text = car.desc; // 将模型desc数据解析到表格cell的detailTetLabel中
cell.detailTextLabel.textColor = ;// 设置cell中detailTextLabel颜色
// 以下判断该当前cell是否需要打勾,与后续功能实现相关
// 如果当前模型数据在临时数组中则该cell显示打勾
if () {
cell.accessoryType = UITableViewCellAccessoryCheckmark; // 打勾
} else {
cell.accessoryType = UITableViewCellAccessoryNone; // 去掉打勾
}
return cell;
}
#pragma mark 返回表格高度--UITableViewDelegate协议方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return kCellHeight; // cell高度
}
#pragma mark cell触摸事件响应--UITableViewDelegate协议方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
SACar *car = _cars;
// 基本处理思想:当触摸当前cell时将当前cell的模型对象添加到数组,实现打勾
// 如果已经存在数组说明之前有触摸,则从数组中删除,实现去掉打勾
if () {
;
} else {
;
}
// 局部刷新,只刷新当前单元格
withRowAnimation:UITableViewRowAnimationNone];
}
#pragma mark 删除按钮事件响应
- (IBAction)remove:(UIBarButtonItem *)sender {
// 遍历临时数组,即将删除的模型对象全部取出,并将模型对象对应cell的indexPath保存到一个数组,方便局部刷新使用
// 如果全局刷新则不需要该步骤
NSMutableArray *array = ;
for (SACar *c in _selectedCars) {
NSIndexPath *indexPath = inSection:0];
;
}
; // 数据源中删除已选中需要删除的模型对象
; // 临时数组清空,准备下次使用
; // 局部刷新
// ; // 全局刷新
}
#pragma mark 反选按钮事件响应
- (IBAction)antiElection:(UIBarButtonItem *)sender {
// 基本思想:1、全部模型-已选择模型=未选择模型;2、将(未选择模型)替换(已选择模型),实现反选
NSMutableArray *array = ;
;
_selectedCars = array;
; // 全局刷新
}
@end
4、源代码下载:
**** Hidden Message *****
页:
[1]