通过这个例子可以对UITableView有一个基本的了解
并且在加载Cell时使用了内存优化,引用了对内存池中对象的调用,提高性能
在修改数据的时候,使用的是UIAlertView,使用了更新优化,只是让被修改的一项cell刷新操作,其他的项不变
基本思路还是:
通过初始化数据源
字典转模型
赋值数据
initCustom.h:这个文件是把h文件和m文件中公共的一段代码通过这种带有参数的宏定义来实现
#ifndef _2_0527UITableView____initCustom_h
#define _2_0527UITableView____initCustom_h
#define init(name)\
- (instancetype)initWithDict:(NSDictionary *)dict;\
+ (instancetype)name##WithDict:(NSDictionary *)dict;
#define initWithDict(name)\
- (instancetype)initWithDict:(NSDictionary *)dict{\
self = [super init];\
if(self){\
[self setValuesForKeysWithDictionary:dict];\
}\
return self;\
}\
+ (instancetype)name##WithDict:(NSDictionary *)dict{\
return [[self alloc] initWithDict:dict];\
}
#endif
调用:
CHHeros.m:
#import "CHHeros.h"
@implementation CHHeros
/**
* 实现initWithDict和herosWithDict
*/
initWithDict(heros);
@end
CHHeros.h:
#import <UIKit/UIKit.h>
#import "initCustom.h"
@interface CHHeros : NSObject
@property (copy,nonatomic) NSString *icon;
@property (copy,nonatomic) NSString *name;
@property (copy,nonatomic) NSString *intro;
/**
* 对外提供初始化的herosWithDict类方法
*/
init(heros)
@end
CHViewController.m:这里实现了三个协议的方法
#import "CHViewController.h"
#import "CHHeros.h"
@interface CHViewController () <UITableViewDataSource,UITableViewDelegate,UIAlertViewDelegate>
@property (strong,nonatomic) NSArray *herosArray;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end
@implementation CHViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.dataSource = self;
self.tableView.rowHeight = 60;
self.tableView.delegate = self;
self.tableView.separatorColor = [UIColor redColor];
//设置头部View尾部View
self.tableView.tableHeaderView = [UIButton buttonWithType:UIButtonTypeContactAdd];
self.tableView.tableFooterView = [UIButton buttonWithType:UIButtonTypeContactAdd];
}
//懒加载模型数组数据
- (NSArray *)herosArray{
if(!_herosArray){
NSString *path = [[NSBundle mainBundle] pathForResource:@"heros" ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *arrayM = [[NSMutableArray alloc] initWithCapacity:array.count];
for(NSDictionary *dict in array){
CHHeros *heros = [CHHeros herosWithDict:dict];
[arrayM addObject:heros];
}
_herosArray = [arrayM copy];
}
return _herosArray;
}
//告诉TableView一共有几组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
//告诉TableView每组有多少数据
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.herosArray.count;
}
//为每一个cell设置数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//内存优化:
//先去内存中找是否有hero标记的缓存对象,如果有,则直接返回,并赋值,如果没有,则新建一个对象,赋值并打上hero标签
static NSString * identify = @"hero";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identify];
if(!cell){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identify];
// NSLog(@"创建了一个新对象");
}
//indexPath.section 是不对的
CHHeros *heros = self.herosArray[indexPath.row];//这里返回的是第几行
cell.imageView.image=[UIImage imageNamed:heros.icon];
cell.textLabel.text = heros.name;
cell.detailTextLabel.text = heros.intro;
//设置cell的辅助视图
// cell.accessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
cell.accessoryView = [[UISwitch alloc] init];
//设置cell的背景颜色
cell.backgroundColor = [UIColor grayColor];
// 设置选中状态的背景
// UIView *backView = [[UIView alloc] init];
// backView.backgroundColor = [UIColor darkGrayColor];
// cell.selectedBackgroundView = backView;
// 设置默认状态的背景---即backgroundView,因为它会覆盖backgroundColor
cell.backgroundColor = [UIColor whiteColor];
// NSLog(@"heros.name:%@",heros.name);
return cell;
}
#pragma mark - 点击每一行的Cell
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
CHHeros * heros = self.herosArray[indexPath.row];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"修改姓名" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
UITextField *text = [alert textFieldAtIndex:0];
text.text = heros.name;
[alert show];
alert.tag = indexPath.row;
}
#pragma mark - 点击UITableView时出发这个事件
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
// NSLog(@"%d",buttonIndex);
if(0 == buttonIndex) return;
UITextField *textField = [alertView textFieldAtIndex:0];
NSString *text = textField.text;
int row = alertView.tag;
CHHeros *hero = _herosArray[row];
hero.name = text;
//修改cell中的text值后,立即更新这个cell
NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:0];
[self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationLeft];
}
#pragma mark - 控制状态栏是否显示
- (BOOL)prefersStatusBarHidden{
return YES;
}
@end
==============
在设置id标示符的时候,为了提高性能,要把标示设置为static