為什么cellForRowAtIndexPath代理方法不執(zhí)行

問(wèn)題描述

tableView有一個(gè)代理方法:

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

用來(lái)在需要時(shí)返回cell視圖。

但是你可能偶爾會(huì)出現(xiàn) 下面的兩個(gè)代理方法都走了,而上面的方法沒(méi)有走,

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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

那么可能的原因是什么呢?為什么只走了部分代理呢?

思路分析

首先,如果代理方法沒(méi)有走,你應(yīng)當(dāng)從那些方面分析呢?

  • 代理有沒(méi)有設(shè)置?
  • 代理方法有沒(méi)有實(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)用了部分方法,而沒(méi)有全部調(diào)用。很可能是因?yàn)榇碓谑褂眠^(guò)程中被釋放掉了。

我們知道代理一般使用weak屬性,是一種弱引用,所以,倘若創(chuàng)建了一個(gè)代理對(duì)象沒(méi)有被控制器或者其他對(duì)象強(qiáng)引用,就直接設(shè)置到tableView的代理,就可能出現(xiàn)代理方法調(diào)用部分的情況。

所以要檢查代理有沒(méi)有地方強(qiáng)引用。

解決方案

因此檢查tableView的代理方法為什么沒(méi)有調(diào)用或者只部分調(diào)用,應(yīng)當(dāng)檢查以下幾個(gè)方面:

  • 代理對(duì)象有沒(méi)有被控制器或其他對(duì)象所持有
  • 是否設(shè)置tableView的delegate和dataSource
  • 是否實(shí)現(xiàn)了所需的代理方法
  • numberOfRowsInSection:返回是否大于1
  • tableView是否被添加到父視圖( addSubview對(duì)添加到視圖強(qiáng)引用)
  • 是否觸發(fā)了代理調(diào)用,比如視圖將要出現(xiàn),tableView的frame正常
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容