以编程方式从嵌入导航控制器的视图中解除弹出窗口

Posted

技术标签:

【中文标题】以编程方式从嵌入导航控制器的视图中解除弹出窗口【英文标题】:Programmatically dismiss popover from view embedded in navigation controller 【发布时间】:2014-02-23 17:56:51 【问题描述】:

我有一个视图控制器。当我按下其中的按钮时,会出现一个带有 uitableview 的弹出框控制器。我选择了一行,其中显示了另一个视图,其中包含一些控件。当我按下一个显示“保存项目”的按钮时,我希望它关闭弹出框。我该怎么做?

这是我尝试过的:

使用委托和协议模式。这没有用,因为为了在我的 tableview 中推送另一个视图,整个东西必须嵌入到导航视图控制器中,所以当我 segue 时,它​​会转到导航控制器,而不是我可以设置 popover 委托的 tableview为。

将我的主视图添加为我要关闭的视图的成员。我不知道为什么这不起作用。

【问题讨论】:

【参考方案1】:

硬清洁方法

故事中有四个视图控制器,外加一个弹出框控制器。我将这三个视图控制器称为“主视图控制器”、“导航”、“vcA”和“vcB”。据我了解,“nav”是弹出框的初始内容视图控制器,并以“vcA”作为其根视图控制器。

main view controller -> popover controller -> nav -> vcA -> (later) vcB

当您从主视图控制器呈现弹出框时,您会保留对弹出框控制器的引用。如您所知,这就是解雇成为可能的原因。

当您创建 Save 按钮时,您将其目标设为主视图控制器,并将其操作设为主视图控制器中的方法。您必须在代码中进行设置;它无法从情节提要中配置,因为您无法形成从一个场景到另一个场景的动作。 (您之所以能够这样做,是因为您在最初配置弹出框控制器时引用了 nav 和 vcA。因此,您可以将 vcA 引用传递给主视图控制器 self。如有必要,然后可以传递此引用当 vcB 被召唤并推送到导航堆栈时,沿着从 vcA 到 vcB 的链。)

现在用户点击保存,主视图控制器的方法运行,它使用对弹出框控制器的引用告诉它关闭。

简单的脏方法

这一切都太糟糕了。主视图控制器注册一个 NSNotification。保存按钮发布该 NSNotification。完毕。 :)

中道

您可以使用 popover segue 在情节提要中设置整个链,并通过与主视图控制器中的 unwind 方法匹配的 Unwind segue 进行解除。一开始我从没想过这个,因为我不太喜欢popover segues。但它确实有效。

【讨论】:

谢谢。当我有机会时,我会试一试。我会先尝试正确的方法。 :-) 刚刚想到第三种方法 - 将其添加到我的建议列表中。 "当您从主视图控制器呈现弹出框时,您会保留对弹出框控制器的引用。"对。当我在情节提要中将该 segue 称为弹出框时,如何获取指向它的指针并将其保存在主视图控制器的弹出框控制器变量中? 我想通了:你在 prepareForSegue 方法中做到了。然后我以编程方式为viewWillAppear 中的vcB 按钮添加了addTarget。感谢您的帮助!【参考方案2】:

这就是我解决问题的方法(抱歉英语不好):

首先,在 VcA 中创建一个UIStoryboardPopoverSegue 的属性,并从主视图控制器中设置它。

Nav -> VcA_ViewController

@property (strong, nonatomic) UIStoryboardPopoverSegue *popupSegue;

然后,在主视图控制器 prepareForSegue 中设置属性:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if([segue.identifier isEqualToString:@"your segue from the mainview to the navigation"]) 
    UINavigationController *navigationController = (UINavigationController *)c;
    VcA_ViewController *vcA = (VRPointOfInterestsFiltersViewController *) navigationController.topViewController;
    vcA.popupSegue =  (UIStoryboardPopoverSegue*)segue;
 

现在,您可以通过 VcA 控制器获得关闭按钮

- (IBAction)dismissPopoup:(id)sender 
[self.popupSegue.popoverController dismissPopoverAnimated:YES]; 

不要忘记将 MainViewController 中的 popOverSegue 链接到 NavController。

希望对你有帮助!

【讨论】:

以上是关于以编程方式从嵌入导航控制器的视图中解除弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式快速实例化具有嵌入式导航控制器的视图控制器?

以编程方式将导航控制器嵌入模态视图控制器

模式解除后返回导航控制器索引(无情节提要)

以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器

以编程方式打开视图控制器并且看不到导航栏。斯威夫特 3

Swift 以编程方式导航到另一个视图控制器/场景