【问题标题】:Dismissing a UIPopoverController from within its contentViewController?从其 contentViewController 中关闭 UIPopoverController?
【发布时间】:2012-04-10 06:53:46
【问题描述】:

如果你想关闭一个弹出框——例如,从弹出框的 contentViewController 中的一个按钮,你必须——

  1. 创建对要由创建它的视图控制器持有的弹出框的引用
  2. 从 contentViewController 创建一个通知,让拥有的视图控制器知道它应该被关闭,或者为相同目的创建一个委托
  3. 当弹出框准备好被关闭时发送通知或委托消息
  4. 调用通知或委托方法时调用dismissPopover:animated

同时,从UIViewController 可以访问模态视图控制器、父视图控制器、导航控制器、拆分视图控制器、标签栏控制器、搜索显示控制器、子视图控制器、呈现视图控制器和呈现的视图控制器。

有没有更好的方法从弹出框的 contentViewController 中做到这一点?

【问题讨论】:

    标签: iphone ios cocoa-touch uipopovercontroller


    【解决方案1】:

    不幸的是,您必须创建对上述UIPopoverController 的弱属性引用,因为无法从内容视图控制器中访问它。

    我很惊讶 UIViewControllers 可以访问模态视图控制器、父视图控制器、导航控制器、拆分视图控制器、标签栏控制器、搜索显示控制器,并且从 iOS 5 开始,子视图控制器为以及展示和展示的控制器......但不是弹出框控制器(授予的弹出框不是UIViewControllers,但仍然)。

    从技术上讲,有一个私有的、未记录的方法来检索 UIViewController 所在的 popoverController...我不知道他们为什么从未公开它,因为它应该与上述任何控制器完全相同。

    即使在私人的、无证的世界中,也没有与dismissModalViewcontrollerAnimated: 等价的东西。您仍然需要获取该引用,然后以这种方式将其关闭。

    【讨论】:

    • 在搜索完文档后,我也对此感到惊讶。不幸的是,这在整个过程中添加了不需要的依赖项。
    • 在iOS8中,你现在可以选择:self.popoverPresentationController
    【解决方案2】:

    解决此问题的另一种方法是创建一个抽象视图控制器(适用于所有视图控制器),将NSNotification 观察者添加到诸如-(void)closePopoverIfNecessary:(NSNotification*)notification 之类的方法中,并让子类可选地实现该方法以关闭它们的弹出窗口( s) 如果打开。然后从弹出框的控制器中触发通知以关闭它。如果需要,您还可以通过通知 (userInfo) 传递其他信息。

    这样就不需要父引用了。

    【讨论】:

    • 有了这个不要忘记删除抽象控制器dealloc中的观察者
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多