无法自动更新tableview

时间:2012-06-05 08:19:34

标签: ios tableview

我有一个包含许多视图和tableview的视图控制器。

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

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

按钮的方法在自定义单元格类中,所以我尝试实例化我的视图控制器(带有tableview的视图控制器)并执行一个方法来更新视图和tableview中的一些标签:

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

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

我错过了什么?

编辑:添加一些代码以便更清楚。

这是我用来更新tableview的方法。它位于具有嵌入式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方法不起作用。

3 个答案:

答案 0 :(得分: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];
    
  3. 老人回答:

    你应该致电

      [self.tableView reloadData]
    
    来自updateEverything方法实现的

    。这将重新加载表数据,有效地更新其行外观。显然,在点击一行按钮时,应调用updateEverything方法,以便工作正常。

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

答案 1 :(得分:0)

你试着把

[[self tableView] reloadData];

我记得我遇到过这样的问题,这句话就解决了我的问题。

答案 2 :(得分:0)

这是你的问题:

  

按钮的方法是在自定义单元格类中,所以我试过了   实例化我的视图控制器(带有tableview的视图控制器)和   执行一种方法来更新视图中的一些标签   的tableview:

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