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

时间:2014-02-23 17:56:51

标签: ios objective-c uitableview uipopovercontroller

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

这是我尝试过的:

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

  • 将我的主视图添加为我想要忽略的视图的成员。我不知道为什么这不起作用。

2 个答案:

答案 0 :(得分:1)

硬道路

故事中有四个视图控制器,还有一个弹出控制器。我将调用三个视图控制器“主视图控制器”,“nav”,“vcA”和“vcB”。据我了解,“nav”是popover的初始内容视图控制器,并以“vcA”作为其根视图控制器。

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

当您从主视图控制器显示弹出窗口时,您将保留对弹出控制器的引用。正如你所知,这就是解雇的可能原因。

创建“保存”按钮时,将其目标设为主视图控制器,并将其操作设置为主视图控制器中的方法。你必须在代码中设置它;它无法从故事板配置,因为您无法从一个场景到另一个场景形成一个动作。 (你可以这样做是因为你在最初配置弹出控制器时开始引用nav和vcA。因此你可以向vcA提交对自身的引用,即主视图控制器。如果需要,你可以传递这个引用从vcA链接到vcB,因为vcB被召唤并推送到导航堆栈。)

现在用户点击Save,你的主视图控制器的方法运行,它使用它对popover控制器的引用来告诉它解雇。

轻松肮脏的方式

所有这一切。主视图控制器注册NSNotification。 “保存”按钮发布了NSNotification。完成。 :)

中间道路

您可以使用popover segue在故事板中设置整个链,并通过主视图控制器中的展开方法匹配的Unwind segue进行解雇。我最初从未想过这个,因为我不喜欢popover segues。但它确实有效。

答案 1 :(得分:0)

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

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

导航 - > 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。

希望它有所帮助!