問(wèn)題描述
tableView有一個(gè)代理方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
用來(lái)在需要時(shí)返回cell視圖决瞳。
但是你可能偶爾會(huì)出現(xiàn) 下面的兩個(gè)代理方法都走了错忱,而上面的方法沒有走,
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // Default is 1 if not implemented
那么可能的原因是什么呢?為什么只走了部分代理呢抡句?
思路分析
首先愈涩,如果代理方法沒有走笔刹,你應(yīng)當(dāng)從那些方面分析呢尖坤?
- 代理有沒有設(shè)置?
- 代理方法有沒有實(shí)現(xiàn)夯接?
- numberOfRowsInSection:返回大于1嗎焕济?
- 你知道代理方法在什么時(shí)候會(huì)調(diào)用嗎?
首先盔几,NSTableView的代理方法光督,在tableView將要出現(xiàn)的時(shí)候會(huì)調(diào)用其代理方法进萄,通常情況在 tableView 被 addSubview:
時(shí)會(huì)被調(diào)用浮禾,或者在 reloadData
時(shí)會(huì)被調(diào)用。cell在可以顯示的時(shí)候才會(huì)調(diào)用cellForRowAtIndexPath,如果tableView的frame大小不能顯示cell的時(shí)候际邻,cellForRowAtIndexPath也可能不會(huì)調(diào)用。
所以芍阎,我們可以分析世曾,在確定代理方法實(shí)現(xiàn)的情況下,代理方法為什么只調(diào)用了部分方法谴咸,而沒有全部調(diào)用轮听。很可能是因?yàn)榇碓谑褂眠^(guò)程中被釋放掉了。
我們知道代理一般使用weak屬性岭佳,是一種弱引用血巍,所以,倘若創(chuàng)建了一個(gè)代理對(duì)象沒有被控制器或者其他對(duì)象強(qiáng)引用珊随,就直接設(shè)置到tableView的代理藻茂,就可能出現(xiàn)代理方法調(diào)用部分的情況。
所以要檢查代理有沒有地方強(qiáng)引用玫恳。
解決方案
因此檢查tableView的代理方法為什么沒有調(diào)用或者只部分調(diào)用,應(yīng)當(dāng)檢查以下幾個(gè)方面:
- 代理對(duì)象有沒有被控制器或其他對(duì)象所持有
- 是否設(shè)置tableView的delegate和dataSource
- 是否實(shí)現(xiàn)了所需的代理方法
- numberOfRowsInSection:返回是否大于1
- tableView是否被添加到父視圖( addSubview對(duì)添加到視圖強(qiáng)引用)
- 是否觸發(fā)了代理調(diào)用优俘,比如視圖將要出現(xiàn)京办,tableView的frame正常