0

セルがタップされたときに UIViewController をモーダルに表示する UITableView があります。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 開発は初めてですが、これを行うためのより良い/推奨される方法があるかどうかわかりませんか?

4

1 に答える 1

0

私の意見では、あなたの問題に対してよりエレガントなアプローチがあるかもしれませんが、あなたがしていることに欠陥はありません。1つのオプションは、委任を介して情報を元のコントローラーに戻すことです。たとえば、特定のフィールドの編集が完了すると、委任者はこれをすぐに通知され、データモデルに必要な変更を加えます。このように、モデル参照を前後に渡すことはなく、実際には、1つのコントローラーのみがそのコンテンツの編集を担当していることを確認します。何かのようなもの:

- (void)doneEditing {
   if ([_delegate respondsToSelector:@selector(fieldChanged:)]) {
      [_delegate fieldChanged:self.newFieldValue];
   }
}
于 2013-02-03T09:01:39.890 に答える