无法刷新可重用的UITableViewCell数据

时间:2012-07-27 15:22:22

标签: iphone ios uitableview

我有一个带有自定义UITableViewCell的UITableView。

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

//create the cell
MyCell *cell = (MyCell*)[tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
cell.label.text = ..
cell.label2.text = ..
cell.label3.text = ..

一切正常,我的所有数据都正确加载等等。

现在,我在此View Controller上有一个按钮,可以打开另一个视图,用户可以在其中选择要显示的标签。因此,例如,显示标签1和3,但不是2 ...... 然后,当单击Done时,我希望更新tableView以反映新选项,但由于单元格已加载了reuseCellId,因此不会显示任何更改。如何强制细胞重建?

3 个答案:

答案 0 :(得分:0)

这不是一个好方法
当您想要刷新单元格时,可以通过使用不同的标识符来实现此目的

我不确定是否还有其他更好的方法。

答案 1 :(得分:0)

我认为你能做的最好的事情就是将单元格配置存储在某种结构中(带有要显示的标签索引的集合在这里就可以了)并用你的按钮改变这个结构并重新加载表格视图。然后,在tableView:cellForRowAtIndexPath:方法中,您应该检查该配置结构,以便知道哪些按钮应该可见。

此代码可能有所帮助:

@interface MyViewController : UIViewController
{
    ...
    NSMutableSet *_labelsToShow;
}

...
@property (nonatomic, retain) NSMutableSet labelsToShow

@end


@implementation MyViewController
@synthesize labelsToShow = _labelsToShow;

- (void)dealloc
{
    [_labelsToShow release];
    ...

}


//you may know which button has to add/remove each label, so this needs to be fixed with your logic
- (IBAction)myButtonAction:(id)sender
{
    if (hasToShowLabel)
    {
        [self.labelsToShow addObject:[NSNumber numberWithInteger:labelIdentifier]];
    } else
    {
        [self.labelsToShow removeObject:[NSNumber numberWithInteger:labelIdentifier]];
    }
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"myCell";
    MyCustomCell *cell = (MyCustomCell *)[tableView dequeReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil)
    {
        cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault] autorelease];
    }

    cell.label0.hidden = (![self.labelsToShow containsObject:[NSNumber numberWithInteger:0]]);
    cell.label1.hidden = (![self.labelsToShow containsObject:[NSNumber numberWithInteger:1]]);
    cell.label2.hidden = (![self.labelsToShow containsObject:[NSNumber numberWithInteger:2]]);
    ...

    return cell;
}


@end

祝你好运!

答案 2 :(得分:0)

我通过破坏tableview并每次都重新创建它来解决这个问题。