带有单个自定义单元格的 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 没有情节提要