iOS中UITableView学习笔记(一)

下面将会对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中调用UIScrollViewflashScrollIndicators方法让滚动条闪动一次,从而提示用户该控件是可以滑动的。


下面主要是讲下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 allocinitWithStyle: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 mainBundleloadNibNamed:@"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的重用进行剖析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值