4

我正在使用 SplitViewController。在 MasterViewController 的 viewDidLoad 中:

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

在 DetailViewController 中,我有两个文本字段。在 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 来看,当 text field 委托方法被调用时,它只被调用一次,然后 updateMasterTableView 被调用一次。当我通过调试器运行它时,在 reloadMasterTableView: 方法上放置一个断点,它会通过该方法两次。这是为什么?谢谢。

或者,如果有更好的方法可以在两个视图之间进行同步,我会全力以赴。

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;

而不是在updateMasterTableViewdo 中发布您的通知:

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

最后在您的 MasterView 控制器中,设置委托并响应回调

希望这可以帮助

于 2012-05-31T18:50:36.203 回答