最近笔者在公司的iOS开发中,有一个iOS开发同事跑来问了两个问题:1.给UITableView设置了组头和组尾视图,但是一直显示不出来?2.UITableView的section的header和footer视图,没有产品经理需要的悬停效果?针对于这2个问题,我详细的测试了一下,然后得出了如下结论。

针对于问题一,是因为对方创建UITableViewController的时候使用了错误的构造方法。如果用导航控制器pushUITableViewController类型的控制器,必须给定UITableView的style。如下所示,错误方式和正确方式:

// UITableViewController错误创建方式:
WSTableViewController *tableVC = [[WSTableViewController alloc] init];
[self.navigationController pushViewController:tableVC animated:YES]; // UITableViewController正确创建方式:
WSTableViewController *tableVC = [[WSTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
[self.navigationController pushViewController:tableVC animated:YES]; // 注意:很多初级iOS工程师创建UITableViewController的时候习惯用init,殊不知,UITableViewController与其他控制器不同,需要指定控制器的tableView的style。
// 另外,自定义UITableViewController需要重写init方法的时候,也不要傻乎乎的重写init方法,而是需要重写initWithStyle:方法。

针对于问题二,UITableView的style无论是plain还是grouped样式,都可以设置组头组尾视图(通过代理方法)。但需要注意的是,如果UITableView的style设置为grouped样式,那么组头和组尾视图没有悬停效果。相反,如果UITableView的style设置为plain样式,那么组头和组尾视图会有悬停效果。如下图1为plain样式下的悬停效果;图2为grouped样式下的非悬停效果。(PS:下图中的UITableView分为3组,每组10行)

iOS之UITableView组头组尾视图/标题悬停-LMLPHP                  iOS之UITableView组头组尾视图/标题悬停-LMLPHP

           图1                                                                图2

同理,组头标题和组尾标题也是如此。下图3为plain样式的效果,图4为grouped样式的效果。

iOS之UITableView组头组尾视图/标题悬停-LMLPHP                 iOS之UITableView组头组尾视图/标题悬停-LMLPHP

注意:对于组头组尾视图,如果控制器是作为子控制器被push或者modal的。那么如果被push或者modal的UITableViewController为UITableViewStylePlain样式,那么很遗憾,依旧不会显示组头和组尾视图。所以只能够设置为UITableViewStyleGrouped样式。那么问题又来了,组头组尾视图是有了,但是不能够悬停。

     对于组头组尾标题,不管控制器作为子控制器push或者modal出来的。UITableViewController为UITableViewStylePlain样式,会有悬停效果。如果被push的UITableViewController为UITableViewStyleGrouped样式,不会有悬停效果。

04-26 12:31