我可以将视图控制器推送到后端的 UINavigationController

Posted

技术标签:

【中文标题】我可以将视图控制器推送到后端的 UINavigationController【英文标题】:Can I push a viewcontroller to a UINavigationController in backend 【发布时间】:2011-05-31 04:24:42 【问题描述】:

我的应用的根视图控制器是一个导航控制器,一个 ImagePickerController 被呈现为模态视图控制器。选择图像后,我想将视图控制器推送到根导航控制器之前 ImagePickerController 被解雇。 这可能吗?感谢您的任何提示:)

=================== 我曾尝试在 ImagePickerController 被解除之前推送一个新的视图控制器。但它没有被推送,似乎 UINavigationController 只有当它是当前的顶视图控制器时才能用于推送/弹出。 @巴拉 如果我先关闭 ImagePickerController,然后推送一个视图控制器,就会有两个动画。烦人~

【问题讨论】:

【参考方案1】:

好吧,如果您要求在当前视图控制器之上推送一个视图控制器,那么您可以这样做

[self.navigationController pushViewController:controller animated:YES];

当图像选择器在此方法中被关闭时

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

    [[picker parentViewController] dismissModalViewControllerAnimated:YES];
    ...
    [self.navigationController pushViewController:controller animated:YES];
    ....

如果您要求显示根视图控制器,则可以使用此方法

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated

但是,如果您要求将视图控制器推送到堆栈底部,那么没有可用的文档记录方法。

【讨论】:

我的问题是如何在后端推送视图控制器(标记为 VC1),以便在 UIImagePickerController 消失之前已经推送了 VC1。如果没有,会有两个动画(一个是 UIImagePickerController 消失,另一个是推 VC1),这看起来不太好。 @Fourj 可以将动画设置为 NO 来推送视图【参考方案2】:

我假设您从导航控制器堆栈中的控制器呈现图像选择器控制器。因此,如果您已将 imagepicker 的委托设置为提供 imagepicker 控制器的控制器,则可以在 imagepicker 委托方法中执行以下操作:

[self.navigationController pushViewController:newController animated:NO]; 
//Now dismiss imagepicker controller
[picker.parentViewController dismissModalViewControllerAnimated:YES];

【讨论】:

【参考方案3】:

要从根视图控制器推送视图控制器,您只需要设置一个委托。基本上,在您的模态视图控制器的标题中,插入

id delegate;

@property (nonatomic, assign) id delegate;

在实现文件中综合。

当您创建要呈现的模态视图控制器时,设置myModalViewController.delegate = self;。现在您可以从您的委托调用根视图控制器中的方法。例如,您可以在根视图控制器中有一个名为 pushVC 的方法,因此在关闭模态视图控制器之前,您可以从其中调用 [self.delegate pushVC];,它将执行您在该方法中拥有的任何内容,例如代码从模态视图控制器下方推送视图控制器。您可能希望在模态视图控制器中为您的委托方法设置一个@protocol 以减轻任何警告,但没有它应该可以正常工作

【讨论】:

以上是关于我可以将视图控制器推送到后端的 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

将视图推送到当前根视图下方的堆栈中

UINavigationController 在将 3 个视图推送到堆栈后崩溃

将视图控制器推送到另一个视图控制器时如何处理 UIParallaxDimmingView?

如何将新的 viewController 推送到另一个视图控制器中的现有视图中?

iOS - UITableView 将 URL 推送到不同视图控制器中的 UIWebView

是否可以在 SwiftUI 中提供服务并将数据推送到视图并更新 UI?