Objective C - cellForRowAtIndexPath 单元格从不为零?

Posted

技术标签:

【中文标题】Objective C - cellForRowAtIndexPath 单元格从不为零?【英文标题】:Objective C - cellForRowAtIndexPath Cell Never Nil? 【发布时间】:2015-09-12 19:47:07 【问题描述】:

我正在使用 QuickBlox 框架来构建一个聊天应用程序。下面是 cellForRowAtIndexPath 代码。

有些事情我只想对每个单元格执行一次(例如下载图像),所以据我所知,我应该添加 if (!cell) 块来执行此操作。

但是,即使是第一次加载 tableview,该块也不会真正触发。为什么会这样?

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


   QBChatMessage *message = [[ChatService shared] messagsForDialogId:self.dialog.ID][indexPath.row]; 
   ChatMessageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ChatMessageCellIdentifier];

   if (!cell) 
   // some things I only want to do once here, such as download images. but it never fires
   

   [cell configureCellWithMessage:message];
   return cell;

【问题讨论】:

如果您使用了registerClass:forCellReuseIdentifier:dequeueReusableCellWithIdentifier 不会返回 nil 是的。你可以在你知道的文档中找到... @rmaddy 我确实使用了 registerClass...还有其他方法可以让我做我想做的事吗? 当然 - 删除 registerClass... 的使用。然后你就可以在cellForRow...做你想做的事了。 【参考方案1】:

如果您没有使用registerClass:forCellReuseIdentifier: 注册单元格,则对dequeueReusableCellWithIdentifier: 的调用只会返回nil

删除您对registerClass:forCellReuseIdentifier: 的使用,然后dequeueReusableCellWithIdentifier: 可以返回nil,您可以创建一个新单元格并在您的if 语句中正确初始化它:

if (!cell) 
    cell = [[ChatMessageTableViewCell alloc] init...]; // use proper init method
    // setup cell as needed for first time

【讨论】:

谢谢,我一直都是通过注册课程来完成的。这很简单,帮助了我【参考方案2】:

相反,您可以在 ChatMessageTableViewCell 类的初始化程序中执行一次性操作。这样您就可以保持您在注册时所习惯的行为。

【讨论】:

以上是关于Objective C - cellForRowAtIndexPath 单元格从不为零?的主要内容,如果未能解决你的问题,请参考以下文章

如何自学objective c语言?

objective-c入门

Objective-C和C的区别

objective-c与C++的区别

在 Mac OS X 上结合 Objective-C 和 C/C++

Objective-C 和 MetroWerks C/C++ IDE