从模态视图中删除呈现视图

Posted

技术标签:

【中文标题】从模态视图中删除呈现视图【英文标题】:Removing presenting view from Modal View 【发布时间】:2012-11-04 12:39:21 【问题描述】:

我有这样的视图层次结构: MainView -> SubView (PresentingView) -> ModalViewc(UIViewController的所有子类)

通过单击 ModalView 中的按钮,我想同时删除 ModalView 和 PresentingView,这样我就可以返回 MainView,然后它将显示 ModalViewX:

MainView -> ModalViewX(UIViewController的所有子类)

[[self presentingViewController] removeFromParentViewController];

上面的代码只是关闭了 ModalView,但 PresentingView 仍然存在。

我的最终目标是让 ModalView 按钮在返回 MainView 之前执行一些结束逻辑。单击按钮基本上会执行以下操作:

    结论逻辑 删除 self(ModalView) 和 PresentingView(如果我可以为删除设置动画,则可以加分) 告诉 MainView 呈现 ModalViewX (也许我必须以某种方式调用 ModalView -> viewDidUnload 方法中的第 3 步)

关于如何做到这一点的建议?

【问题讨论】:

您将事物称为“视图”,然后显示与视图控制器相关的代码。您真正与哪个合作? 是 UIView 还是 UIViewController 的 SubView 和 ModalView 子类? UIViewController 的子类。 【参考方案1】:

首先,将您的整个项目嵌入到 UINavigationController 中,并以MainViewController 作为根视图。要从MainViewControllerSubViewController,请执行以下操作:

- (IBAction) theButtonClicked : (id) sender 
    SubViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"YourIdentifier"];
    [self.navigationController pushViewController:vc animated:YES];

这将使您进入下一个 UIViewController。如果要传递信息,只需设置vc setVariable:即可。

要返回根视图,只需调用[self.navigationController popToRootViewControllerAnimated:YES]

另一种方法是使用segues,你CTRL+drag 从按钮到下一个UIViewController。然后应该在方法- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 中设置要完成的逻辑,其中destionationcontroller 是segue.destinationViewController

这样,您还可以通过将 seguestyle 设置为自定义并继承 UISegue 来添加自定义动画。

【讨论】:

【参考方案2】:

对于第 1 步(即“结论逻辑”),使用目标-动作设计。具体来说,这意味着您将向对象添加一个方法,该方法将在特定事件发生时被调用。例如,这可以通过控制从情节提要拖到您的视图控制器中来完成。您选择的视图控制器是目标,您创建的方法是操作。更多详情在这里:https://developer.apple.com/library/mac/#documentation/General/Conceptual/Devpedia-CocoaApp/TargetAction.html

要控制视图控制器的流程,您有几个不同的选项。

对于模态视图控制器,最佳做法是将删除委托给呈现视图控制器。这意味着模态视图控制器有一个名为delegate的属性,当模态视图控制器准备好被删除时(即模态视图控制器不会自行删除),它将收到一条消息。应该符合您创建的协议的委托可以处理任何相关的结束逻辑并调用dismissViewControllerAnimated,这将删除呈现的(模态)视图控制器。

或者,您可以使用故事板中的转场来管理流程,正如 Martol 所提到的。

有关这些管理视图控制器数据和流程的方法的更多详细信息,请查看:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ManagingDataFlowBetweenViewControllers/ManagingDataFlowBetweenViewControllers.html

希望对您有所帮助。

【讨论】:

以上是关于从模态视图中删除呈现视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从模态视图控制器调用呈现视图控制器的方法

Laravel 将数据从 ajax 传递到位于单独文件中的模态视图,导致模态视图无法呈现

从模态视图呈现视图控制器给出错误

从模态呈现的视图控制器内部呈现 UIPopoverController

从 uitabbarController 视图中关闭模态视图

在弹出窗口中呈现模态视图