我有一个带有自定义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,因此不会显示任何更改。如何强制细胞重建?
答案 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并每次都重新创建它来解决这个问题。