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

时间:2012-04-27 09:31:18

标签: objective-c ios uinavigationcontroller modalviewcontroller

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

基本上将我的ViewController复制为“添加”和“编辑”似乎并不正确,但推送和模态ViewControllers的工作原理存在一些差异,这使得事情复杂化。

我该怎么做才能涵盖这两个基础?

-

差异包括。

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

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

1 个答案:

答案 0 :(得分:0)

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

至于解雇,你可以有类似的东西:

- (void)didCancel {
    [self.navigationController popViewControllerAnimated:YES] || [self dismissModalViewControllerAnimated:YES];
}

如果你的viewcontroller是navigationcontrol的一部分,那么这将是shortcircuit,否则使用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
}

在委托的实现中,你可以把:

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