2012-06-05 70 views
0

我有一个视图控制器,许多视图和一个tableview。不能自动更新tableview

tableview的单元格是自定义的,所以还有另外一个类来设置单元格。 在每个单元格中都有一个按钮。此按钮的图像根据单元格的内容而变化(从数据库读取此内容)。

基本上,当用户按下按钮时,它将自己改变为另一个图像,新的状态被写入数据库,但tableview不会自动更新自身。

该按钮的方法是在自定义细胞类,所以我试图实例我的视图控制器(所述一个与所述的tableview),并执行用于更新在视图中的一些标签和tableview中的方法:

ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init]; 
[vc updateEverything]; 

但这不起作用。 从相同的“ViewControllerWithTable”调用(添加重载按钮)的相同“updateEverything”方法完美地工作。 在viewWillAppear方法中添加“[tableView reloadData]”将不起作用,因为所有操作都在同一视图中完成。

我错过了什么?

编辑:添加一些代码更清晰。

这是我用来更新tableview的方法。这是与嵌入式的tableview的视图控制器内,当通过一个按钮在一个视图中触发它的工作原理:

- (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方法不起作用。

+0

那么'updateEverything'是怎么样的呢?有一些方法可以在单独的indexPath上重新加载单元格。你应该看看它们。 – Eimantas

回答

3

编辑你添加更多的代码后:

在下面几行:

 if ([alrtTitle isEqualToString:s3]) { 
      // DB writing and reading 
      ViewControllerWithTable *vc = [[ViewControllerWithTable alloc] init]; 
      [vc updateEverything]; 

你实例完全新的视图控制器,无关与所显示的表视图原始视图控制器。所以,你正在发送更新消息给错误的对象。

你需要的是一个让你的细胞知道哪个是正确的控制器发送消息的机制。

一个简单的解决办法是使用NSNotificationCenter

  1. 视图控制器寄存器本身在一定形式的通知:

    [[NSNotificationCenter defaultCenter] 
    addObserver:self 
    selector:@selector(updateEverything:) 
    name:kCellSentUpdateMessageNotification 
    object:nil]; 
    
  2. 您的小区发送的通知,而不是调用消息直接:

    [[NSNotificationCenter defaultCenter] postNotificationName:kCellSentUpdateMessageNotification object:nil]; 
    

OLD答:

你应该叫

[self.tableView reloadData] 

updateEverything方法实现。这将重新加载表数据,有效地更新其行外观。当点击连续的按钮以使其工作时,将调用updateEverything方法,显然。

如果这不起作用,请提供更多代码。

+0

是的,我已经这样做了,但是从自定义单元类中调用该方法将不会更新tableview。 – Aleph72

+0

请说明你是如何在代码中做到这一点的。视图控制器是否引用了您要从单元发送'updateEverything'消息而不是零? – sergio

+0

我已经添加了一些代码。请致电 – Aleph72

0

你有没有尝试把

[[self tableView] reloadData];

我记得我有这样的一个问题,而这条线之上解决我的问题。

0

这是你的问题:

该按钮的方法是在自定义单元格类,所以我试图 实例我的视图控制器(在一个与实现代码如下),并 执行的方法更新视图中的一些标签和 实现代码如下:

您创建了没有你的tableview的知识,一个全新的视图控制器。最好的办法是在您的单元格子类中创建一个属性,并在设置单元格时将其设置为您的视图控制器。然后你可以在该属性上调用你的updateEverything方法。

+0

我不知道我明白你在说什么。你能举个例子吗? – Aleph72