UITableView有一个自定义Cell吗? (苹果手机)

时间:2010-02-25 20:35:21

标签: iphone uitableview

我遇到了一些问题。通常在处理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中的第一个Cell与其他Cell不同。我有一个特殊的图标和其他东西,将它与其他单元格分开。

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

if (indexPath.row == 0) {

    //do special setup!

}

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

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

当您点击一个单元格时,对单击的单元格indexPath.row毫无疑问,您需要将此索引与模型数组配对以确定用户点击的内容。但是,当TableView操作单元格(在屏幕上,屏幕外,删除,添加)时,似乎应用了不同的规则。

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

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

1 个答案:

答案 0 :(得分:1)

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

既然你给了它与常规单元格相同的CellIdentifier,它就不知道它们是不一样的。

这样的事情应该解决它:

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

我不确定您的编辑按钮问题,但它可能是相关的。