从模态视图中删除呈现视图
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
作为根视图。要从MainViewController
到SubViewController
,请执行以下操作:
- (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