在UITableView和呈现的UIViewController之间共享数据模型?

时间:2013-02-03 08:23:40

标签: ios objective-c model-view-controller model

我有一个UITableView,它在点击一个单元格时以模态方式呈现UIViewController。 UIViewController从与抽头单元格对应的模型对象接收数据,并显示编辑这些数据的界面。当用户完成编辑时,按钮点击取消UIViewController,并将编辑内容写入模型对象。

以下代码是否会出现任何内存或设计问题?

在呈现UITableView子类实现时,充当呈现的UIViewController的委托:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UINavigationController *navigationController = segue.destinationViewController;
    navigationController.delegate = this;
    navigationController.dataModel = someDataModel;
}

// delegate callback
- (void) onViewControllerDone: (UIViewController *)controller {
    [self.tableView reloadData];
}

在呈现的UIViewController子类实现中:

- (IBAction) done: (id)sender {
    // directly modify dataModel passed into UIViewController with data from UI
    [self.dataModel.someProperty setString: self.textView.text];

    [self.delegate onViewControllerDone:self];
}

将数据模型传递到视图中并让视图进行更改时,有些闻起来很有趣。我是Objective-C / iOS开发的新手,并不确定是否有更好/首选的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

在我看来,尽管你的问题可能有更优雅的方法,但你所做的事情并没有任何缺陷。一种选择是通过委托将信息传递回原始控制器,因此,例如,一旦您完成了对某个字段的编辑,就会立即通知委托,并对数据模型进行必要的更改。这样,就不会来回传递模型引用,并且实际上确保只有一个控制器负责编辑它的内容。类似的东西:

- (void)doneEditing {
   if ([_delegate respondsToSelector:@selector(fieldChanged:)]) {
      [_delegate fieldChanged:self.newFieldValue];
   }
}