带有单个自定义单元格的 UITableView? (苹果手机)

Posted

技术标签:

【中文标题】带有单个自定义单元格的 UITableView? (苹果手机)【英文标题】:UITableView with a single custom Cell? (iPhone) 【发布时间】:2010-02-25 20:35:20 【问题描述】:

我遇到了一些问题。通常在处理 UITableView 时我会构建一个特殊的 方法 configureCell,它根据 tableView 的需要构建单元格。所以 cellForRowAtIndexPath 查询 configureCell 以获取一个新的单元格,如果在缓存中没有找到。

在每次用户滚动时运行的 cellForRowAtIndexPath 部分:

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
        static NSString *CellIdentifier = @"Cell";

        UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil)        
            cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
            [self configureCell:cell atIndexPath:indexPath];
        
//this part is always executed!

我从我的模型中设置标签值等。这工作得很好,我相信这就是它应该如何正常工作并且对 CPU 的压力最小。根据我在 TableView 指南中可以阅读的内容。

我的问题是我的 tableView 中的第一个单元格与其他单元格不同。我有一个特殊的图标和其他将它与其他单元格分开的东西。

然后我在我的配置单元格中尝试询问:

if (indexPath.row == 0) 

    //do special setup!


这是一个坏主意,因为 tableView 延迟加载单元格,因此屏幕外的第一个单元格在屏幕上滚动时也会得到 indexPath.row = 0 所以现在我有一个“特殊单元格”每个7个细胞。 如何解决这个问题?

同样源于上述问题的第二个问题:我在所有单元格accessoryView 中放置了一个自定义UIView。当用户点击“编辑”按钮时,所有单元格的附件视图都应更改为一个图标,指示我们处于“编辑模式”。同样,这仅发生在屏幕上的单元格上,当滚动“旧”单元格时,要么从缓存中获取,要么构建不知道我们处于编辑模式的新单元格。

当您点击一个单元格时,毫无疑问的是被点击的单元格的indexPath.row,您需要将此索引与您的模型数组配对以找出用户点击的内容。但是,当 TableView 操作单元格(将它们拉到屏幕上、离屏、删除、添加)时,似乎适用不同的规则。

我猜,我在问;为了遵循最佳实践而不是与 SDK 对抗,我应该怎么做才能获得所需的功能?我应该在 Cell 生命周期的哪个阶段应用这个逻辑?

希望有人能指导我正确的方向:) 提前谢谢你:)

【问题讨论】:

你用的是什么 TableViewController 样式? 啊,Rob 没有看到你的问题。这是我手动添加到 UIViewController 的 UITableView。它不使用部分。像这样:self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease];这能回答你的问题吗? 刚刚改成:self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain] autorelease];可以肯定:) 你能在 //this part is always executed处包含代码吗? 嗨,罗伯。抱歉耽搁了。我已经重写了所有单元格代码以使用自定义 UIView 类而不是自定义图形。 IE。我写了一个带有 displayState 方法的 UIView, - (void) - displayState:(DisplayState)state。通过将状态设置为“SpecialIcon”,视图会隐藏常规图形并显示特殊图形,反之亦然。每次运行时我都需要在 cellForRowAtIndexPath 中设置它。我想经验法则必须是“在构建单元时绝对没有自定义代码,只有在更新它时”。 【参考方案1】:

我认为问题不在于第一个屏幕外单元格位于indexPath.row = 0。 问题是您对常规单元格和自定义单元格使用相同的 CellIdentifier。因此,当 TableView 将缓存单元格出列时,它有时会抓取包含图标的自定义单元格。

因为你给它的 CellIdentifier 和你的常规单元格一样,它不知道它们是不一样的。

这样的事情应该可以解决它:

static NSString *CellIdentifier;
if([indexPath row] == 0)
    CellIdentifier = @"CustomCell";
 else 
    CellIdentifier = @"Cell";

我不确定您的编辑按钮问题,但可能与此有关。

【讨论】:

是的,回顾过去,我也很确定这就是发生的事情。 if(indexPath.row == 0) 的方法是正确的。为第一行构建一个自定义单元格并使用不同的标识符是正确的方法。

以上是关于带有单个自定义单元格的 UITableView? (苹果手机)的主要内容,如果未能解决你的问题,请参考以下文章

带有包含自定义单元格的 UITableView 的 UISearchBar => 空白单元格

带有自定义单元格的 UITableView 弹出窗口失败,单元格属性始终为零

带有自定义单元格的 ViewController 内的 UITableView 没有情节提要

iOS - 带有自定义单元格的可点击 UITableView

带有Swift的多个自定义单元格的UITableview

带有多个自定义单元格的“UITableView 无法从其数据源获取单元格”