UISplitViewController的肖像:如何以编程方式隐藏主popover?

时间:2011-04-19 19:27:37

标签: objective-c cocoa-touch ipad

在我的UISplitViewController中,主控制器是UINavigationController。 在纵向模式下,只要用户向上导航(使用后退按钮),我想保持导航控制器可见。一旦选择了导航控制器的表视图中的项目,我想解除弹出窗口。 我怎样才能做到这一点?我的UITableViewController如何知道它是否在弹出窗口内,如果是,则解雇自己?

3 个答案:

答案 0 :(得分:20)

使主视图控制器为UISplitViewControllerDelegate(如果尚未安装)并将其连接到UISplitViewController的delegate插座。

在主视图控制器中创建一个UIPopoverController变量:

// MyViewController.h
@interface MyViewController : UIViewController <UISplitViewControllerDelegate> {
    UIPopoverController *popoverController;
}
@property (retain, nonatomic) UIPopoverController *popoverController;

// MyViewController.m
@synthesize popoverController;

实现以下UISplitViewControllerDelegate方法:

// Called when rotating to portrait
- (void)splitViewController:(UISplitViewController*)svc
     willHideViewController:(UIViewController *)aViewController
          withBarButtonItem:(UIBarButtonItem*)barButtonItem
       forPopoverController:(UIPopoverController*)pc {

    // Popover controller is visible in portrait
    self.popoverController = pc;
}

// Called when rotating to landscape
- (void)splitViewController:(UISplitViewController*)svc
     willShowViewController:(UIViewController *)aViewController
  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {

    // No popover controller in landscape view
    self.popoverController = nil;
}

在主视图控制器中的自己的处理程序中(在表视图中选择导航项时调用的处理程序):

- (void)navigationControllerSelectedItem:(id)item {
    // If a popover controller is visible, hide it
    if (popoverController) {
        [popoverController dismissPopoverAnimated:YES];
    }
}

不要忘记发布该变量:

- (void)dealloc {
    self.popoverController = nil;
    [super dealloc];
}

希望有所帮助!

答案 1 :(得分:0)

iOS5中SplitViewController的标准iPad示例与精心设计的答案大致相同,但popoverController称为masterPopoverController。

创建属性iOS5样式作为_popoverController不起作用,因为在UIViewController.h中已经有一个带有该名称的ivar。

答案 2 :(得分:0)

IOS 6.0 SplitView模板内置了此功能。详细信息视图跟踪方向和MasterViewController弹出窗口。

只需设置detailItem,弹出窗口就会消失。甚至可以检查您是否使用相同的细节,因此不会进行页面设置和刷新工作。

self.detailViewController.detailItem = self.detailViewController.detailItem;