您的位置:首页 > 编程语言

通过xib和代码自定义cell

2015-03-06 03:32 302 查看
一、通过xib自定义cell

1、自定义根源 :默认的UITableCell的内容是固定的。当自带的cell不满足需求时,并且cell的内容是固定的,就可以通过xib来自定义cell。如果不固定就需要手动代码来自定义cell。
2、当你新建一个项目时,你的控制器继承自NSObject协议。但可以自定义一个控制器,继承字UITableVIewController。这样的话你的类的内部就实现了代理数据源协议,并且自带一些必须的方法。
3、如何自定义xib及加载,新建一个empty定义为名.xib文件,拖一个UItableVIewCell控件,在上面拖三个UILable一个UIImageVIew。如果想让UILable自动换行让lines等于1。加载控件有两种方式1UItableVIewCell *cell = [[NSBundle mainBundle] loadNibNamed: owner: option:][0]加载之后是一个数组,调用第一个返回的就是你创建的xib的主控件。2.UINib
*nib = [UINib nibWithNIbName:@“hello" bundle:[UIbundle mainBundle]];调用nib的方法返回,nib类中一共就三个方法。如果需要重用,需要在xib文件中给indentifier赋值,在尖尖的尖头那栏,这样就实现了。
4、设置cell的高度有两种方式,一种是代理方法,一种是tableview自带属性rowheight。
5、通过模型将plist文件里的字典转换成模型,字典转换后的都是对象,当赋值给基本数据类型时,进行intValue的转换等。通过加载已经拥有了cell,但需要给cell里面的每一个控件赋值,如何做,1绑定tag不可取。2、把xib封装成模型,但要注意,模型要继承对应xib的空间类型,比如继承UITableViewCell类。但如何让xib和类文件有关联呢。但需要设置xib文件的class类型为控件类。class为什么类型创建出来的对象就是什么类型的,然后通过连线讲内部子控件连起来,创建cell的时候,可以把上面的两种加载文件的方法封装到类内部,class只能设置当前类型及其子类。控件模型的属性控件用weak。
6、最后把数据模型也封装到xib模型内部,在set方法里给控件的属性负赋值。
7、下面的代码没有xib文件,xib文件需要做的。1创建empty文件。2拖控件。3设置identifer。 4设置class。 5与xib模型属性联系。

xib模型

#import <UIKit/UIKit.h>xib

#import "Data.h"

@interface Cell :
UITableViewCell

@property (nonatomic,weak)
IBOutletUILabel *desc;控件类型的成员变量

@property (nonatomic,weak)
IBOutletUILabel *name;

@property (nonatomic,weak)
IBOutletUIImageView *icon;

@property (nonatomic,strong)
Data *data;数据模型,用来给上面的空间的属性赋值
+(id)newCell;类方法创建cell
+(NSString *)reuseId;把reuse主键封装到模型内部

@end

#import "Cell.h"

@implementation Cell
+(id)newCell{创建方法就是通过bundle加载文件

return [[NSBundlemainBundle]
loadNibNamed:@"cell"owner:niloptions:nil][0];
}
+(NSString *)reuseId{

return @"cell";
}

-(void)setData:(Data *)data{通过set方法给控件内的属性赋值,注意很好的思想

_data = data;

_desc.text = data.desc;

_name.text = data.name;

_icon.image = [UIImageimageNamed:data.icon];
}

@end

数据模型

#import <Foundation/Foundation.h>数据模型很简单就是普通的文件,但要和xib模型文件关联,这里的数据最终要射入到xib模型内部

@interface Data : NSObject

@property (nonatomic,copy)
NSString *desc;

@property (nonatomic,copy)
NSString *icon;

@property (nonatomic,copy)
NSString *name;

-(id) initWithDesc:(NSString *)desc withIcon:(NSString *)icon withName:(NSString *)name;

- (id)initWithDictionary:(NSDictionary *)dictionary;讲plist文件内的dictionary封装成模型

@end

#import "Data.h"

@implementation Data

- (id)initWithDesc:(NSString *)desc withIcon:(NSString *)icon withName:(NSString *)name{

if (self = [superinit]) {

_desc = desc;

_icon = icon;

_name = name;

}

return
self;

}

- (id)initWithDictionary:(NSDictionary *)dictionary{

if (self = [superinit]) {

_name = dictionary[@"name"];

_desc = dictionary[@"desc"];
_icon = dictionary[@"icon”];返回的都是对象,如果是基本数据类型则需要转换

}

return
self;

}

@end

控制器代码

#import "ViewController.h"

#import "Data.h"

#import "Cell.h"

@interface
ViewController ()<UITableViewDataSource,UITableViewDelegate>
{

NSMutableArray *_modelArray;全局数据模型
}

@end
@implementation ViewController
- (void)viewDidLoad {

[superviewDidLoad];通过bundle获取文件路径

NSString *path = [[NSBundlemainBundle]
pathForResource:@"shops.plist"ofType:nil];

NSArray *array = [NSArray
arrayWithContentsOfFile:path];返回数组,通过数组的方法加载文件路径

_modelArray = [NSMutableArrayarray];这里要注意,一定要初始化,要不怎么性,编译器不会抱错
[array
enumerateObjectsUsingBlock:^(id obj,
NSUInteger idx, BOOL *stop) {

Data *data = [[Data
alloc] initWithDictionary:obj];
[_modelArrayaddObject:data];
}];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

return _modelArray.count;返回一共有多少行,每一次的reload都是调用的方法
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath{
tableView.rowHeight =104;设置tableview的高度

Cell *cell = [tableViewdequeueReusableCellWithIdentifier:[CellreuseId]];先从缓冲池中取,取不到在创建

if (cell == nil) {
cell =[CellnewCell];把创建方法封装到模型内部
}
cell.data =_modelArray[indexPath.row];给xib模型的数据属性赋值,通过数据属性的set方法给模型的属性赋值

return cell;
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: