UITableView基本使用方法

阅读更多

    在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信、QQ等软件上随处都是UITableView。

 

    1,UITableView基本样式

        (1):UITableViewStylePlain(普通表视图)

        (2):UITableViewStyleGroup(分组表视图)

 

    2,UITableView表视图的结构

      (1):表头视图(table header view).表视图最上边的视图,用于展示表视图的信息

      (2):表脚视图(table footer view).表视图最下边的视图,用于展示表视图的部分信息

      (3):单元格(cell)。它是组成表视图每一行的单位视图

      (4):节(selection)。它是多个单元格在组成,并且有节头和节脚

      (5):节头。节的头部,描述节的信息

      (6):节脚.节的尾部,描述节的信息或者一些声明信息

      

    3,表视图的创建

       ios表没有限制行数,行数仅受可用存储空间的限制,表只有一列。是UITableView类的一个实例。

      (1)Controller.h需要实现两个  delegate ,分别是UITableViewDelegate 和  UITableViewDataSource

 

@interface ViewController : UIViewController 

 

      (2)UITableView对象的 delegate和dataSource要设置为 self,并添加至view。

 

tableView.delegate = self;
tableView.dataSource = self;
[self.view addSubview:tableView];

 

      (3)然后就可以实现这些dataSource和delegate的一些方法。

     

     4,dataSource和delegate

        UITableView属于View,UIViewController属于Controller。  

        View所需要的数据,应该是Controller去跟Model协调然后获得,以后由Controller去给View来进行显示。View永远的不去直接跟Model联系。

        这样当UITableView初始化的时候。他就会去问他的data source。我需要显示多少行数据啊。每一行的数据都是什么内容啊。这时候UIViewController应该已经从Model拿到了数据。

        然后,通过- (NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section; 告诉UITableview,你的这一组要显示n条数据。         又用- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath函数 告诉UITableView说,第几组第几条数据的具体内容是什么。

     

       5,UITableViewDataSource常用方法

           (1),必须实现 设置每个分组的行数

 

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

 

           (2),必须实现, 设置每个分区的cell

 

- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
// 每行都是一个UITableViewCell实例

 

           (3),设置分组个数  默认返回1   第一个被调用

 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

 

           (4),为每个分组设置标题

 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

 

           (5),为分组设置索引

 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView              

 

           (6),设置tableView每组的编辑状态              

 

- (BOOL)tableView:(UITableView *)tableView canEditRowA tIndexPath:(NSIndexPath *)indexPath

 

           (7),当提交编辑操作时触发(插入或删除)

 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyleforRowAtIndexPath:(NSIndexPath *)indexPath 

 

           (8),设置tableView每一个cell是否允许移动

 

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath

 

           (9),提交移动操作之后触发

 

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath                

 

 

       6,UITableViewDelegate常用方法

           (1),设置行高

 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

 

           (2),设置cell选中的事件

 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath                

 

           (3),设置tableViewCell的编辑样式(插入,删除) 

 

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath               

 

           (4),设置当点击删除按钮时提示的确认文字

 

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath                 *)indexPath NS_AVAILABLE_IOS(3_0)

 

           (5),设置cell的移动位置

 

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath                       *)sourceIndexPath toProposedIndexPath:(NSIndexPath*)proposedDestinationIndexPath{  
//现在移动时只能在本区内移动    //sourceIndexPath原地址    //proposedDestinationIndexPath将要移动到的地址                               

        if(sourceIndexPath.section == proposedDestinationIndexPath.section) {        //如果是同一个分区,返回目的地址                                       
                returnproposedDestinationIndexPath;   
        }        //如果不是同一个分区,返回原来的地址                                                 

         returnsourceIndexPath;    
}

                

       7,UITableViewCell

             (1)UItableViewCell的四种风格常量:

UITableViewCellStyleDefault                      
UITableViewCellStyleSubtitle 
UITableViewCellStyleValue1                      
UITableViewCellStyleValue2

             (2)表视图中cell的实现:

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

             {  

                      static NSString *identifier = @"Cell";  

                      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];  

                      if (!cell) {  

                               cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Cell];  

                      }  

                               return cell;  

               }  

 

             (3)重用机制:UITableView的dequeueReusableCellWithIdentifier方法去一个队列里面需找有没有相同ID的的Cell。如果有,就提出来重用。如果没有就跳进if里面去创建。所以我们在if里面创建的时候,不会改变的内容都可以在里面创建,这样就只用创建一次。需要改变的内容我们就放到if后面去写。 这样我们就能完成高效的UITableView。当然,理论上来说,你可以不用这样的机制,而去直接每次创建一个Cell。不过这是非常浪费资源的一个做法,不提倡。

我们可以这样理解, dequeueReusableCellWithIdentifier方法 就是用来创建几个有限的cell。 其实,手机屏幕再大,可显示的行数也是有限的。 或许,一个TableView 的数据来源有可能是上千条数据,但我们不会为此创建上千个Cell,如果这样做,对内存将是一个极大的浪费。所以呢, 我们通过dequeueReusableCellWithIdentifier方法,重用已经创建的Cell, 只需要填充不同的数据即可。 

 

 

 

 

你可能感兴趣的:(ios)