xib文件可以针对某些视图控制器或者视图进行定制,而storyboard是xib文件的整合,可以开发整个app的框架。可以这么理解,xib上的视图之间是独立无法通过连线来关联,但storyBoard上的控制器之间可以通过连线来关联,这为我们减少了代码量。 今天我们准备了一个小例子,来实现storyboard和xib的混合使用来定制UITableViewCell。
首先我们创建一个单视图项目,此项目默认自带Main.storyboard并且已经关联好ViewController类了。其次我们往storyboard自带的ViewController的view中拖入一个UITableView,此步我们为view中添加了tableView。
重点又来了,很多同学会拖拖拽拽,但是不知道什么时候需要进行关联,这里有个简单的方法进行判断:1.由我们自己拖上去的UI控件系统并没有帮我们关联,所以需要我们自己进行关联;2.如果这个UI控件需要签署代理,那么它被拖进哪个父视图或父视图控制器就需要去实现协议。如此实例,该tableView需要实现UITableViewDelegate和UITableViewDataSource协议可以由view 或ViewController来实现。但分析一下,view是ViewController自带的视图,如果想让view来实现协议,我们必须给view创建一个UIView子类来进行关联后才能实现,所以为了方便起见,我们让ViewController来实现协议,如下图,右键单击tableView拖住delegate和dataSource往ViewController上关联。
上一步我们的代理签署好了,那么如果你想去访问这个tableView必须给他关联到ViewController类中,选择关联到.h或者.m的区别在于:.h是对外可以访问的关联,.m是对外访问不到的关联。
首先我们创建CocoaTouch类,继承自UITableViewCell,同时选中”Also create XIB file”,这样创建的xib自带的tableViewCell就自动关联到我们创建的TableViewCell类上。
按照下图,拖入一个UIImageView和两个UILabel,当然你可以按照你的设计自己DIY一下。注意,我们拖入的控件默认是放在tableViewCell的contentView中的。
由XIB创建的tableViewCell在注册的时候需要提供一个identifier,这一点没得商量,所以一定要设置好哦!因为一个XIB文件中也可以有很多个视图,identifier是标记它的唯一性。
此文档是我创建,此控件是我拖拽,所以如果想调用XIB上的控件必须关联到类,下图把XIB中拖拽进去的控件关联到我们创建的类,然后你就不需要做什么了。真的吗?真的!因为XIB中我们已经调整好了位置和大小,除非你对自己的拖拽不太满意。
下面在ViewController中完成最后一步
#import "ViewController.h"
//1.导入头文件
#import "TableViewCell.h"
//2.实现代理
@interface ViewController () <UITableViewDelegate,UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
//创建数据源
@property (nonatomic,strong)NSMutableArray *dataSource;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//初始化数据源
self.dataSource = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
NSDictionary *dic = @{@"image":@"1",
@"label1":@"name",
@"label2":@"content"};
[_dataSource addObject:dic];
}
[_tableView registerNib:[UINib nibWithNibName:@"TableViewCell" bundle:nil] forCellReuseIdentifier:@"pool"];
}
//返回每组行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return _dataSource.count;
}
//返回每个cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"pool"];
cell.picture.image = [UIImage imageNamed:_dataSource[indexPath.row][@"image"]];
cell.titleLable.text = _dataSource[indexPath.row][@"label1"];
cell.contentLabel.text = _dataSource[indexPath.row][@"label2"];
return cell;
}
//返回行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 100;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}