0

モデルオブジェクトデータを表示する基本的なテーブルビューコントローラーがあります。そのオブジェクトを呼び出しましょうuserInfo。各セルは、ユーザーがプロパティを変更できる異なるビューコントローラーに接続されuserInfoます。1つのプロパティは配列namesです。name配列内のそれぞれは、単一のテーブルセクションに表示されます。name名前セルは、配列を編集または追加するためのテキストフィールドを備えた単純なViewControllerに接続しますname

これは非常に単純な概念ですが、実装にはいくつかの異なる方法があります。MVC設計に最も適合する最もクリーンなアプローチを使用したいと思います。

私の現在の実装ではprepareForSegue

if ([segue.identifier isEqualToString:@"EditName"]) {
        EditNameVC *controller = segue.destinationViewController;
        controller.userInfo = self.userInfo;
        NSArray *names = [self.userInfo objectForKey:@"names"];
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDictionary *nameInfo = [names objectAtIndex:indexPath.row];
        NSString *name = [nameInfo objectForKey:@"title"];
        if (name) {
            controller.name = name;
        }
    }

BOOLを渡して、辞書がに追加されるのではなく置き換えられることisEditingをEditNameVcに通知します。これにより、宛先ViewControllerに問題が発生します。を編集する場合、vcはどのインデックスで辞書を置き換えるかをどのように知るのでしょうか?EditNameVCでプライベートプロパティを作成し、各インをループして使用する必要がありますか?indexPathを渡す必要がありますか?どちらのオプションもだらしのないようです。nameInfoarraynameoldNameObjectnameInfonamesreplaceObjectIdenticalTo

別の考慮事項として、EditTableVCはモデルオブジェクトについて何も知らず、モデルオブジェクトを変更するメインテーブルビューコントローラーへのデリゲートを呼び出す必要がありますか?

4

1 に答える 1

1

ブロック補完でこれを行うには、次のことを行う必要があります...

編集中のviewController(プッシュしたもの)では、ブロックポインタの宣言が必要です

@interface YourClass : UIViewController

// some properties
@property (nonatomic, copy) void (^onCompletion)(NSString *editedName);

@end

次に、実装では、完了アクションが呼び出されたときにこのブロックを呼び出す必要があります。

- (void)doneTapped;
{
  if (self.onCompletion) {
    self.onCompletion(self.editedName);    
  }
}

あとは、このコントローラーを押した場所にコールバックを設定するだけです

if ([segue.identifier isEqualToString:@"EditName"]) {
  // Create and set up controller

  controller.onCompletion = ^(NSString *editedString) {
    [self.navigationController popViewControllerAnimated:YES];

    // do whatever you want with the edited string
    // If names was mutable

    [names replaceObjectAtIndex:indexPath.row withObject:editedString];
  }
}

私は似たような名前に固執しようとしましたが、おそらくこれをもっと一般化するでしょう

于 2012-12-03T22:25:44.570 に答える