从contentViewController中解除UIPopoverController?

时间:2012-03-26 18:35:25

标签: iphone ios cocoa-touch uipopovercontroller

如果你想解雇一个弹出窗口 - 例如,从popover的contentViewController中的一个按钮你必须 -

  1. 创建对由创建它的视图控制器持有的弹出框的引用
  2. 从contentViewController创建一个通知,让拥有的视图控制器知道它应该被解雇,或者为了相同的目的创建一个委托
  3. 当弹出窗口准备好被解雇时发送通知或委托消息
  4. 调用通知或委托方法时调用dismissPopover:animated
  5. 同时,从UIViewController您可以访问模态视图控制器,父视图控制器,导航控制器,拆分视图控制器,标签栏控制器,搜索显示控制器,子视图控制器,呈现视图控制器和呈现的视图控制器。

    有没有更好的方法从popover的contentViewController执行此操作?

2 个答案:

答案 0 :(得分:29)

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

我很惊讶UIViewControllers如何访问模态视图控制器,父视图控制器,导航控制器,拆分视图控制器,标签栏控制器,搜索显示控制器以及iOS 5中的子视图控制器以及呈现和呈现控制器...但不是弹出控制器(授予的弹出窗口不是UIViewController但仍然是。)

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

虽然即使在私人的,未记录的世界中,也没有相当于dismissModalViewcontrollerAnimated:的东西。你仍然必须得到那个引用然后以这种方式解雇它。

答案 1 :(得分:1)

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

这样就不需要父引用了。