0

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

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

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

[[self presentingViewController] removeFromParentViewController];

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

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

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

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

4

2 回答 2

1

首先,将您的整个项目嵌入到 UINavigationController 中,并将其MainViewController作为 rootview。要从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目标控制器所在的方法中设置要完成的逻辑segue.destinationViewController

这样,您还可以通过将 seguestyle 设置为 custom 和 subclassing 来添加自定义动画UISegue

于 2012-11-04T12:56:17.313 回答
1

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

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

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

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

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

希望有帮助。

于 2012-11-05T13:20:15.043 回答