2010-02-25 91 views
0

我遇到了一些问题。通常,在处理UITableView时,我将构建一个特殊的 方法,configureCell,它构建tableView需要的单元格。因此cellForRowAtIndexPath查询configureCell以获取新的单元格,如果在缓存中找不到任何单元格的话。具有单个自定义单元格的UITableView? (iPhone)

在这种获取运行用户每次滚动的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个电池就有一个“特殊电池”。 我该如何解决这个问题?

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

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

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

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

+0

你使用了什么TableViewController风格? – 2010-02-25 20:43:05

+0

Ahh在那里看不到你的问题Rob。 这是一个UITableView,我手动添加到UIViewController。它不使用部分。 像这样:self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease]; 这是否回答你的问题? – RickiG 2010-02-25 22:06:42

+0

只是将其更改为: \t self.tableView = [[[[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain] autorelease]; 可以肯定:) – RickiG 2010-02-25 22:19:24

回答

1

我认为问题不在于第一关屏小区在indexPath.row = 0。 问题是您正在使用相同的CellIdentifier常规和自定义单元格。所以当TableView去出队一个缓存的单元格时,它有时会抓住你的自定义单元格,它有图标。

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

像这样的东西应该修复它:

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

我不知道你的编辑按钮的问题,但它可能是相关的。

+0

是的,在回顾过程中,我也很确定发生了什么。 if(indexPath.row == 0)的方法是正确的。为第一行构建自定义单元格并使用不同的标识符是正确的选择。 – RickiG 2011-03-12 10:35:03