2012-08-04 79 views
0

所以我得到它通常不赞成修改的cellForRowAtIndexPath外的小区,但这里是我:修改静态细胞外的cellForRowAtIndexPath而无需创建新的细胞

我有一个作为索引静态表的问题(1-33)。每一行都有一个问题和一个详细的披露指标。所有这些都是手动输入到平板上。

我有一个文件,列出每个问题和一些属性,如问题已被回答。
当这个屏幕加载(viewDidAppear)我想检查是否每个这些问题都已经加载,如果是的话,将细节指标切换到复选标记。

现在这适用于前5个细胞。如果我回答问题并回来,那么会检查更多单元格(即使这些问题尚未得到解答)。这是未定义的行为,因为我在cellForRowAtIndexPath之外访问它吗?

这里是我用来访问和更改单元格中的代码:

-(void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (question1Answered) 
    { 
     UITableViewCell *cell1 = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:3]]; 
     [cell1 setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } 
} 

再次,它的工作的第5个元素,那么剩下的就不会不管我做什么改变。然后,如果我去问一个问题,并返回它显示更多的选择。奇怪的行为...

编辑:我只注意到上述代码的作品,但它只更新当前在屏幕上的单元格。所以如果我向下滚动,离开并回来,所有可见的单元格都会有复选标记。是否有强制刷新所有单元格的方法,即使它们不可见?

感谢您的任何和所有帮助...

-David

回答

0

这与我前几天回答的另一个问题类似。请参阅stackoverflow.com/a/11770387/1479411

使用委托方法。从其他视图控制器返回后,将任何修改单元格内容的代码和[self.tableView reloadData]放入委托方法中。

0

你不应该从viewDidAppear更新单元。

相反,您应该从viewDidApeear重新加载数据。

-(void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (question1Answered) 
    {    
     //This will call your tableview's delegate for visible cells 
     [self.tableView reloadData]; 
    } 
} 

而在cellForRowAtIndexPath中,您应该决定分配附件类型。

0

U应首先更新您的模型,然后根据模型状态更新您的UI。
例如,如果您的模型是一个Question对象的数组,并且每个问题都有一些hasBeenAnswered布尔值。
然后唯一的事情你应该做的viewDidAppear是要打[self.tableView reloadData],这将更新您的表格视图,因为cellForRowAtIndexPath将被调用,并根据您的模型状态设置单元格。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if(cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // configure the cell according to your model state 
    Question *question = [self.questions objectAtIndex:indexPath.row]; 

    // check if this question has been answered 
    if (question.hasBeenAnswered) { 
     // if yes - set a checkmark 
     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } 
    else { 
     // if not - set to none (or whatever u want) 
     [cell setAccessoryType:UITableViewCellAccessoryNone]; 
    } 

    return cell; 
}