在解除模态后,iOS TableView重新加载

时间:2014-07-03 02:38:08

标签: ios core-data tableview modal-view

在我的应用中,我在tableview中列出了核心数据条目。我想允许用户使用模态显示的详细视图作为表单视图来编辑记录。我正在观察编辑记录时的特殊行为。

流程:

  1. 用户使用记录加载tableview。 - 工作
  2. 用户选择要编辑的记录。 - 工作
  3. 用户在视图控制器中编辑记录,显示为模态窗体视图。 - 工作
  4. 用户保存编辑并关闭表单视图。 - 工作
  5. Tableview显示以前编辑过的记录的正确更改。 - 工作
  6. 用户重复步骤2 - 4选择要编辑的其他记录。 - 工作
  7. Tableview显示所有记录的正确数据。 - 没有工作。
  8. 在第7步,tableview会将第一个已修改记录的显示恢复为原始状态。后续记录编辑导致所有先前的编辑恢复到其原始状态。如果取消并重新加载tableview,则记录正确,显示所有编辑。

    我在tableview的ViewWillAppear方法中使用了[tableview reload],但是当模式窗体视图控制器被关闭时似乎没有触发它。

    在我的tableviewcontroller代码中:

    -(void)viewWillAppear:(BOOL)animated
    {
        [self.tableView reloadData];
    }
    

    四处寻找,我还没有找到解决方案,希望有人能指出我正确的方向。

    谢谢!

2 个答案:

答案 0 :(得分:4)

当您呈现模态视图时,主视图控制器的视图永远不会消失。因此,在您关闭模态视图后,不会调用viewWillAppear()。

您可以尝试在模态视图中实现自定义委托函数,并在主视图控制器中设置它,当您的数据更新时,触发委托函数重新加载tableView,它位于您的主viewController。

了解iOS中的委托功能,以及

如何创建委托函数是这样的:

  1. 在你的ModalView.h中:

    // define the protocol for the delegate
    @protocol ModelViewDelegate <NSObject> 
      - (void) didUpdateData;
    @end
    
    @interface ModalView: ViewController {
         //create a delegate instance
         id delegate;
    }
    
    // define delegate instance
    @property (nonatomic, assign) id <ModelViewDelegate> delegate;
    
  2. 在你的modalView.m中:

    @synthesize delegate;
    

    然后在函数内部,将委托函数放在需要触发的位置,例如:

    - (void) updateDataIntoDatabase{
           ....
           //Update work done.
    
           [self.delegate didUpdateData];
           //dismiss your modalView;
    }
    
  3. 因此,在MainViewController.h中,

    #import ModalView.h
    

    @interface ModalView: ViewController <ModelViewDelegate > {
          ...
    }
    

    在MainViewController.m中,您将收到一条警告,说明您需要实现已声明的委托函数。因此,设置委托功能,并执行您喜欢的操作:

    - (void) didUpdateData{
        [self.tableView reloadData];
    }
    

    在实例化modalView实例后,忘记将modelView委托设置为self。如果不是你的代表职能不会被解雇。

    modalView.delegate = self;
    

答案 1 :(得分:0)

触发Modal viewcontroller时使用完成块:

-(void)editModal:(id)sender
{
    KDSecondViewController *secondVC = [[KDSecondViewController alloc] init];
    [self presentViewController:secondVC animated:YES completion:^{
        //-- reload your table view when user dismiss the modal view
        [self.tableView reloadData];
    }];
}