最近筆者在公司的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行)
圖1 圖2
同理,組頭標題和組尾標題也是如此。下圖3為plain樣式的效果,圖4為grouped樣式的效果。
注意:對於組頭組尾視圖,如果控制器是作為子控制器被push或者modal的。那麼如果被push或者modal的UITableViewController為UITableViewStylePlain樣式,那麼很遺憾,依舊不會顯示組頭和組尾視圖。所以只能夠設置為UITableViewStyleGrouped樣式。那麼問題又來了,組頭組尾視圖是有了,但是不能夠懸停。
對於組頭組尾標題,不管控制器作為子控制器push或者modal出來的。UITableViewController為UITableViewStylePlain樣式,會有懸停效果。如果被push的UITableViewController為UITableViewStyleGrouped樣式,不會有懸停效果。