以编程方式显示/隐藏UISplitViewController中的主视图

我有一个使用UISplitViewController的应用程序。 当处于横向模式时,我们有时总想要显示主视图,有时希望它自动隐藏,就像纵向一样。 目前这个设置可以在应用程序中调整。

除了一件事,这一切都很好。 当我改变设置时,我希望自动隐藏设置立即生效,而不仅仅是下一次我旋转设备(即当 – splitViewController:shouldHideViewController:inOrientation:被调用时)。

有没有办法(以编程方式)强制UISplitViewControllerpopup/隐藏主视图,以便SVC将查询splitViewController:shouldHideViewController:inOrientation:方法再次?

任何帮助将不胜感激。

没有简单的方法。

一个function,但有点hacky解决scheme将设置一个委托,并logging显示/隐藏主时,传递给委托的barButtonItem。 您可以使用它来触发button上的操作。 但是,正如我所说,这不是一个很好的做法(可能会在未来):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc { _buttonItem = barButtonItem; // ... } - (void)splitViewController:(UISplitViewController *)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)button { _buttonItem = nil; // ... } - (void)toggleMasterVisible { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" [_buttonItem.target performSelector:_buttonItem.action]; #pragma clang diagnostic pop } 

对于一个现有的button,你可以添加这个目标来实现你想要的:

 [button addTarget: theSplitViewController action: @selector(toggleMasterVisible:) forControlEvents:UIControlEventTouchUpInside]; 

我必须假设,这意味着你可以打电话

 [theSplitViewController toggleMasterVisible: nil]; 

这完全没有logging,但是它与从willHideViewController函数中获得的barButtonItem具有相同的行为。