这是UITableView博客系列的第一篇,使用xib和arc编码,主要讲解一些UITableView使用过程中简单的、但是又容易被忽略的东西,而且我会告诉读者,怎样在使用了之后就再也不会忘记。
操作的步骤如下,
(1)首先拖一个UITableView控件到xib文件上面,如下图,
这没有什么,大家不要太过于害怕UITableView,它只是一个UI控件,跟UIButton和UILabel没什么不一样,可以随意的拖拉。
(2)接下来我们在对应的xxxViewController中实例化这个UITableView对象,这里有一个小技巧需要说明一下,先点击xxxViewController.xib文件,这时候Xcode中显示的就是xib文件的内容,这时候双击xxxViewController.h文件,这时候在小窗口中打开了.h文件,这样就方便了下面的操作。
在xxxViewController.xib文件中点,击TableView,点击鼠标右键,将其拖动到小窗口的xxxViewController.h文件中,如下图,
(3)释放鼠标,这时候会弹出下面的界面,
这里我将UITableView对象命名为theTableView,你可以将其命名为任意的名字,这只是一个变量名称,任意你修改。点击Connect按钮,这样Xcode自动帮我们在xxxViewController.h文件中生成了property声明,
1 |
|
这就是使用xib的好处,节省了很多代码,不是吗?
(4)这一步骤很重要,设置theTableView的delegate和dataSource为self,在xxxViewController.xib文件中,右键拖动鼠标指向File‘s Owner,如下图,
接着会弹出下面的界面,
先点击dataSource,再重复上面的操作,然后点击delegate。这样的界面操作,相当于执行了self.theTableView.delegate = self;和self.theTableView.dataSource = self;语句。我还是要提醒一下,要两次右键拖动UITableView指向File‘s Owner,分别设置dataSource和delegate,顺序随便。
(5)上面都是通过xib来设置界面的,这样省去了不少代码,我截图说明了操作的过程。好了,xib拖动基本就是这么多内容,下面是代码实现的细节。
在xxxViewController.m文件中,实现UITableViewControllerDelegate和UITableViewControllerDataSource协议,并且定义一个NSMutableArray实例变量instance variable,命名为_infoArray,
1 2 3 4 5 |
|
在-viewDidLoad中初始化_infoArray数组内容,
1 2 3 4 5 |
|
好了,这个步骤就是设置theTableView的数据源,有人会问数据源是什么,简单来说数据源就是这个theTableView控件要显示的内容,就像label.text = @"Label内容";,其中@"label内容"字符串就是label控件的数据源。所以我们可以看到,UITableView是完美的使用了MVC设计模式来实现的,其中xxxViewController担任控制者的角色,theTableView是视图,而这里的_infoArray是数据源,实际上这里的_infoArray并不是完整的数据模型,还可以进行更高层次的抽象。
(6)上面我们服从了UITalbeViewDelegate和UITableViewDataSource协议,那么我们就需要在xxxViewController中区实现协议中的代理方法,那么有读者会问,UITableView有那么多的代理方法,我总是记不清楚,这里我将告诉你怎么记得清楚,以后也不会遗忘。
在所有的UITableView代理方法中,返回列表行数(NSInteger)和设置列表内容(UITableViewCell *)是必不可少的两个代理方法,这两个方法的返回值分别是NSInteger和UITableViewCell *内容,所以我们只需要记住返回值,然后Xcode就会自动提示我们需要选择哪个方法,
例如我想实现返回列表行数的方法,这时候只需要输入- (NSInteger)tableView,这时候Xcode会提示我们很多的方法,如下图所示,
这时候我选择第二个numberOfRowsInSection:(NSInteger)section方法,然后在里面返回_infoArray的数组个数,如下代码所示,
1 2 3 4 |
|
这样就设置了返回的行数。
接下来我要设置列表显示的内容,我们知道它的返回值为UITableViewCell *类型,所以我直接这样写,- (UITableViewCell *)tableView,Xcode自动提示我完整的代理方法,如下图所示,
很幸运,返回UITableViewCell *内容的方法只有一个,我不用选择直接按Enter按键就可以了,接着我来实现cellForRowAtIndexPath:(NSIndexPath *)indexPath方法,填充里面的内容,如下代码,
1 2 3 4 5 6 7 8 9 10 11 |
|
上面的代码全都是我手写输入的,因为我已经记得滚瓜烂熟了,算是孰能生巧吧,所以iOS开发,对于一些关键代码,为了不重复查阅资料,还是要用心记下来的。那么怎样记忆上面简单但是又容易遗忘的代码呢?我来说说我的记忆过程吧,首先static NSString *simpleIdentify = @"SimpleIdentify";是设置UITableViewCell的重用标识符,我们知道UITableView的重用机制比较牛逼的技术,这个以后我会写博客来说明的,这里不再多说。接下来我输入代码UITableViewCell *cell = [tableView de];这时候Xcode会自动提示方法列表,如下图,
记住,这里请选择第一个dequeueReusableCellWithIdentifier方法,该方法只有一个NSString *参数,我之前很多次选择了第二个方法,然后程序莫名其妙地cursh了。
接着通过if(cell == nil){}来判断cell是否为空,如果cell为空,则实例化cell对象,代码是cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleIdentify];
然后通过cell.textLabel.text = [_infoArray objectAtIndex:indexPath.row];来设置cell显示的数据源中对应函数的内容,最后通过return cell;返回cell内容。
写完这些代码,我们运行程序,效果图如下,
好了,这就是UITableView的系列一教程,主要是说明通过xib编码,有哪些关键的步骤;还有几十怎样快速记住UITableView的代理方法。