4

SplitViewController を使用しています。MasterViewController の viewDidLoad で:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadMasterTable:) name:ReloadMasterTableNotification object:_detailViewController];

DetailViewController には、2 つのテキスト フィールドがあります。didEndEditing について:

- (void)textFieldDidEndEditing:(UITextField *)textField {
    if ([_detailItem isKindOfClass:[Pill class]]) {
        Pill *p = (Pill *)_detailItem;

        if (textField.tag == TEXTFIELD_NAME_TAG) {
            p.name = textField.text;
        }

        if (textField.tag == TEXTFIELD_NOTE_TAG) {
            p.note = textField.text;
        }

        [self updateMasterTableView];
    }
}


- (void)updateMasterTableView {
    if ([_detailItem isKindOfClass:[Pill class]]) {
        Pill *currentPill = (Pill *)_detailItem;

        NSUInteger indexToReplace = [[[DataManager sharedInstance] pillArray] indexOfObject:currentPill];
        [[[DataManager sharedInstance] pillArray] replaceObjectAtIndex:indexToReplace withObject:currentPill];

        NSLog(@"i should update row: %i", indexToReplace);

        NSIndexPath *path = [NSIndexPath indexPathForRow:indexToReplace inSection:0];
        NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:path, @"IndexPath", nil];
        [[NSNotificationCenter defaultCenter] postNotificationName:ReloadMasterTableNotification object:self userInfo:dict];
    }
}

NSLog から、テキスト フィールド デリゲート メソッドが呼び出されると、1 回だけ呼び出され、その後 updateMasterTableView が 1 回呼び出されます。reloadMasterTableView: メソッドにブレーク ポイントを設定してデバッガで実行すると、メソッドが 2 回実行されます。何故ですか?ありがとう。

または、2 つのビューを同期させるためのより良い方法があれば、私は完全に耳を傾けます。

4

1 に答える 1

0

これを実装するためのより良い方法は、デリゲートパターンを実装することだと思います。

詳細コントローラーで.hプロトコルを定義します

@protocol PillDetailViewControllerDelegate <NSObject>

- (void)PillDetailViewController:(PillDetailViewController *)vc didUpdatePillAtIndexPath:(NSIndexPath)indexpath;

@end

そして、デリゲートプロパティを追加します

@property (nonatomic, assign) id<PillDetailViewControllerDelegate>delegate;

詳細コントローラー.mで、

@synthesize delegate;

通知を投稿する代わりに、次のようにしupdateMasterTableViewます。

[self.delegate PillDetailViewController:self didUpdatePillAtIndexPath:path];

最後に、MasterViewコントローラーで、デリゲートを設定し、コールバックに応答します

お役に立てれば

于 2012-05-31T18:50:36.203 に答える