无法自动更新表格视图
Posted
技术标签:
【中文标题】无法自动更新表格视图【英文标题】:Can't update a tableview automatically 【发布时间】:2012-06-05 08:19:33 【问题描述】:我有一个包含许多视图和一个 tableview 的视图控制器。
tableview 的单元格是自定义的,因此还有另一个类用于设置单元格。 每个单元格中都有一个按钮。此按钮的图像会根据单元格的内容而变化(此内容从数据库中读取)。
基本上,当用户按下按钮时,它会自行更改为另一个图像,将新状态写入数据库,但 tableview 不会自动更新。
按钮的方法在自定义单元格类中,所以我尝试实例化我的视图控制器(带有 tableview 的那个)并执行一种方法来更新视图和 tableview 中的一些标签:
ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init];
[vc updateEverything];
但这不起作用。 从相同的“ViewControllerWithTable”(添加重新加载按钮)调用的相同“updateEverything”方法完美运行。 在 viewWillAppear 方法中添加“[tableView reloadData]”将不起作用,因为所有操作都在同一个视图中完成。
我错过了什么?
编辑:添加一些代码更清楚。
这是我用来更新表格视图的方法。它位于带有嵌入式 tableview 的 ViewController 内,当由其中一个视图中的按钮触发时,它可以工作:
- (void) updateEverything
// lots of DB writing and reading, plus label text changing inside all the views
[tableView reloadData];
这是按钮按下的 IBAction,它位于自定义单元格类中:
-(void) btnPresaPressed:(UIButton *)sender
AppDelegate *deleg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
deleg.did = sender.tag;
NSString *s1 = NSLocalizedString(@"ALERT_TITLE", nil);
NSString *s2 = NSLocalizedString(@"ALERT_BODY", nil);
NSString *s3 = NSLocalizedString(@"YES", nil);
NSString *s4 = NSLocalizedString(@"NO", nil);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:s1
message:s2
delegate:self
cancelButtonTitle:s4
otherButtonTitles:s3, nil];
[alertView setTag:1];
[alertView show];
此方法显示一个调用另一个方法的警报视图,总是在自定义单元格类中:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
AppDelegate *deleg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
DbOperations *db = [[DbOperations alloc] init];
NSString *alrtTitle = [alertView buttonTitleAtIndex:buttonIndex];
NSString *s3 = NSLocalizedString(@"YES", nil);
NSString *s4 = NSLocalizedString(@"NO", nil);
switch (alertView.tag)
case 1:
//
break;
case 2:
if ([alrtTitle isEqualToString:s3])
// DB writing and reading
ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init];
[vc updateEverything];
else if ([alrtTitle isEqualToString:s4])
//
break;
case 3:
if ([alrtTitle isEqualToString:s3])
//
break;
default:
break;
在这种情况下,updateEverything 方法不起作用。
【问题讨论】:
那么updateEverything
长什么样子?有一些方法可以在单独的 indexPath 上重新加载单元格。您可能应该调查一下。
【参考方案1】:
添加更多代码后编辑:
在以下几行中:
if ([alrtTitle isEqualToString:s3])
// DB writing and reading
ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init];
[vc updateEverything];
您正在完全实例化一个新的视图控制器,它与显示表格视图的原始视图控制器无关。因此,您将更新消息发送到错误的对象。
您需要一种机制让您的单元知道哪个是正确的控制器来发送消息。
一个简单的解决方案是使用NSNotificationCenter
:
视图控制器为某种通知注册自己:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(updateEverything:)
name:kCellSentUpdateMessageNotification
object:nil];
您的手机会发送通知,而不是直接调用消息:
[[NSNotificationCenter defaultCenter] postNotificationName:kCellSentUpdateMessageNotification object:nil];
旧答案:
你应该打电话
[self.tableView reloadData]
来自您的 updateEverything
方法实现。这将重新加载表数据,有效地更新其行外观。 updateEverything
方法应该在连续点击按钮时调用,显然。
如果这不起作用,请提供更多代码。
【讨论】:
是的,我已经这样做了,但是从自定义单元格类调用该方法不会更新 tableview。 请在代码中展示你是如何做到这一点的。您从单元格发送updateEverything
消息的视图控制器引用是否不为零?
很好!!我没有考虑通知。现在表格视图得到正确更新。非常感谢。【参考方案2】:
你试过放吗
[[self tableView] reloadData];
我记得我遇到过这样的问题,而上面的这一行解决了我的问题。
【讨论】:
【参考方案3】:这是你的问题:
按钮的方法在自定义单元格类中,所以我试过了 实例化我的视图控制器(带有 tableview 的那个)和 执行一个方法来更新视图中的一些标签和 表格视图:
您创建了一个完全不了解您的 tableview 的全新视图控制器。最好的办法是在您的单元格子类中创建一个属性,并在您设置单元格时将其设置到您的视图控制器。然后你可以在该属性上调用你的 updateEverything 方法。
【讨论】:
我不确定我明白你在说什么。你能举个例子吗?以上是关于无法自动更新表格视图的主要内容,如果未能解决你的问题,请参考以下文章