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

Kru*_*lur 11 cocoa-touch objective-c ipad

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

mke*_*ley 20

使主视图控制器UISplitViewControllerDelegate(如果它还没有)并将其连接到UISplitViewController的delegate插座.

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

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

// MyViewController.m
@synthesize popoverController;
Run Code Online (Sandbox Code Playgroud)

实现以下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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

并且不要忘记发布该变量:

- (void)dealloc {
    self.popoverController = nil;
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!