我应该使用相同的细节ViewController在模态和推送时工作吗?

tra*_*per 5 objective-c uinavigationcontroller modalviewcontroller ios

这似乎是整个Apples应用程序中使用的模式; 通过模态视图创建新记录,需要保存或取消以继续,并且通过推入导航堆栈的视图来编辑记录.

基本上将我的ViewController复制为"添加"和"编辑"似乎并不正确,但推送和模态ViewControllers的工作方式有很多不同之处.

我应该怎么做才能覆盖两个基地?

-

差异包括.

当推入堆栈时,导航栏出现在视图的顶部,可以配置为包含取消/保存按钮.当以模态方式呈现时,情况并非如此,因此复制界面需要单独创建工具栏并关闭/保存添加到此的按钮.

当解除推送视图时,我们向导航控制器发送消息[self.navigationController popViewControllerAnimated:YES];,当解除模态视图时,我们向自己发送消息[self dismissModalViewControllerAnimated:YES];

Bar*_*che 0

您可以在InterfaceBuilder中添加UIToolbar,然后当self.navigationController不为nil时将其隐藏在viewDidLoad中。

至于解雇,你可能会这样:

- (void)didCancel {
    [self.navigationController popViewControllerAnimated:YES] || [self dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

如果您的视图控制器是导航控件的一部分,这将短路,否则使用dismissModalViewControllerAnimated。

这应该适用于您的取消按钮。对于您的保存按钮,调用某种委托方法很有用,例如:

- (void)didSave {
    // do your saving juju here
    if([self.delegate respondsToSelector:@selector(viewController:didSave:]) {
        [self.delegate viewController:self didSave:whatJustGotSaved];
    }
    [self.navigationController popViewControllerAnimated:YES]; // noop if currently modal
}
Run Code Online (Sandbox Code Playgroud)

然后,在委托的实现中,您可以放置​​:

- (void)viewController:(UIViewController*)viewController didSave:(NSObject*)whatJustGotSaved {
    // do stuff with parameters
    [self.modalViewController dismissModalViewControllerAnimated:YES]; // noop if not modal
}
Run Code Online (Sandbox Code Playgroud)