您的位置:首页 > 产品设计 > UI/UE

iOS中UITableView学习笔记(一)

2014-01-27 16:40 295 查看
下面将会对UITableView这个在开发中基本都会用到的控件做一个详细的剖析和解释。这是一个专题,一篇文章当然是讲不完的。所以以后还会有好几篇文章专门去讲它。如果有一些代码或者demo的话,短的就直接粘过来了。或者会发到GitHub上。我刚开始接触的时候也是对tableView不是很了解。也是在网上找一些demo放过来直接用。后来接触的多了,慢慢就会去专研里面的东西。所以我奉行实用主义,用的多了,要实现的需求多了,自然也就对它了解深了。

UITableView堪称UIKit里面最复杂的一个控件了,使用起来不算难,但是要用好并不容易。当使用的时候我们必须要考虑到后台数据的设计,tableViewCell的设计和重用以及tableView的效率等问题。

UITableView继承自UIScrollView,可以表现为Plain和Grouped两种风格,分别如下图所示:





  其中左边的是Plain风格的,右边的是Grouped风格,这个区别还是很明显的。

  查看UITableView的帮助文档我们会注意到UITableView有两个Delegate分别为:dataSource和delegate。

  dataSource是UITableViewDataSource类型,主要为UITableView提供显示用的数据(UITableViewCell),指定UITableViewCell支持的编辑操作类型(insert,delete和reordering),并根据用户的操作进行相应的数据更新操作,如果数据没有更具操作进行正确的更新,可能会导致显示异常,甚至crush。

  delegate是UITableViewDelegate类型,主要提供一些可选的方法,用来控制tableView的选择、指定section的头和尾的显示以及协助完成cell的删除和排序等功能。

  提到UITableView,就必须的说一说NSIndexPath。UITableView声明了一个NSIndexPath的类别,主要用来标识当前cell的在tableView中的位置,该类别有section和row两个属性,前者标识当前cell处于第几个section中,后者代表在该section中的第几行。

  UITableView只能有一列数据(cell),且只支持纵向滑动,当创建好的tablView第一次显示的时候,我们需要调用其reloadData方法,强制刷新一次,从而使tableView的数据更新到最新状态。

在使用时,在.h文件中加上这两个Delegate。

这里有一点要注意。UITableViewController默认的会在viewWillAppear的时候,清空所有选中cell,我们可以通过设置self.clearsSelectionOnViewWillAppear
= NO,来禁用该功能,并在viewDidAppear中调用UIScrollView的flashScrollIndicators方法让滚动条闪动一次,从而提示用户该控件是可以滑动的。

下面主要是讲下tableView中最主要的一个方法。就是

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

为什么说它重要呢?因为在这个方法中,创建cell,cell的重用,对cell里数据的显示都在这里实现。

好了这里先说创建cell与cell的重用,

NSString* cellIdentifier = @"MyCell";

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil){

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];

}
这是一种创建cell的方法,默认cell是横向铺满整个tableView的。至于cell的高度呢?去 - (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath 这个方法中去设置。

另外,还有一种我个人很喜欢的创建cell的方法,就是通过xib文件创建。因为用xib创建,其实定制型更高,也更直观。

这样做你首先要创建一个空的xib,把它的file Owner的class改成你要把tableView添加进去的Controller



然后拖进一个tableViewcell,把它的name设为MyCourseCell。和下面代码nibName的名字一致。

NSString* cellIdentifier = @"MyCell";

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell==nil) {

NSArray* arr = [[NSBundle mainBundle] loadNibNamed:@"MyCourseCell" owner:self options:nil];

cell= [arr objectAtIndex:0];

}

这样就ok啦。

为什么这样方便呢?这样你的cell上有什么label啊,textView啊,image等各种控件,直接拖上去不就OK了么?当然这也只是省去了你去一个个去写alloc的代码,为了使你拖上去的控件在代码中能够拿到,所以我们需要设置个tag值



每一个插入的控件都要设不一样的tag值,不要从0开始设啊,因为默认底层view的tag是0的。所以我一般都是从100开始的。

比如我设置一个label,把它拖到xib上德cell后设置tag=101。在代码中要这么写

UILabel *label = (UILabel *)[cell viewWithTag:101];

这样就拿到label啦,然后你对这个label随便控制就可以了。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

NSString* cellIdentifier = @"CellIdentifier";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell==nil) {
NSArray* arr = [[NSBundle mainBundle] loadNibNamed:@"MyCourseForPad" owner:self options:nil];
cell=  [arr objectAtIndex:0];

cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.backgroundColor = [UIColor clearColor];
cell.contentView.backgroundColor = [UIColor clearColor];

}

UILabel *label = (UILabel *)[cell viewWithTag:101];
label.text = @"hello";
return cell;
}


下一篇文章将对tableViewcell的重用进行剖析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: