我的UISplitViewController
有一个preferredDisplayMode = .AllVisible
。 Here是我设置故事板的方式,请注意详细视图控制器已嵌入UINavigationController
中的方式。
在主视图控制器的toolBar
中点击特定按钮时执行以下方法:
@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {
self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController, sender: sender)
}
现在这在iPhone上处于纵向模式下工作正常,但在iPhone 6+上的横向模式下,我看不到详细视图控制器(刚出现的那个)的navigationBar
。这不是我想要的行为。请注意,默认的详细视图控制器嵌入在UINavigationController
中,因此您可以想象,当navigationBar
突然丢失时,它看起来不一致。
然后我尝试以下方法:
@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {
self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("NavigationSearchViewController") as! NavigationSearchViewController, sender: sender)
}
现在我用与以前相同的VC替换我的Detail View Controller,但它嵌入在UINavigationController
中。该行为按照预期在6+横向模式下工作,因为它显示了navigationBar。
但是在纵向模式下,我看到了glitched行为,因为现在当新VC被推入堆栈时,我看到toolBar
在原始详细信息视图控制器上消失,导致一个奇怪的过渡,显然有些东西没有'走吧。
如何正确使用showDetailViewController(..)
以便我始终将详细视图控制器嵌入UINavigationController
但没有任何奇怪的过渡?我认为这需要我修改UISplitViewController委托,但我不断得到'无法将UINavigationController推送到堆栈。错误。
编辑: 我修改过的唯一代表:
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool {
//Since splitViewController!.showViewController changes secondaryViewController to no longer be a UINavigationController, this must first be checked for there to even be a BlankVC.
if let secondaryNavController = secondaryViewController as? UINavigationController {
if ((secondaryNavController.topViewController) != nil) {
return true
}
return false
}
我目前看到同样的行为。
答案 0 :(得分:1)
问题可能是您的UISplitViewController委托方法
splitViewController:separateSecondaryViewControllerFromPrimaryViewController:
你没有表现出来。
我怀疑它返回的是detailView控制器而不是包含它的导航控制器。
答案 1 :(得分:0)
是的,实施委托:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.splitViewController.delegate = self;
...
}
#pragma mark - UISplitViewControllerDelegate
/* On iPhone 6 Plus:
Portrait: This method is called and YES is returned.
Landscape: This method is not called.
On iPad Air
Portrait: This method is not called.
Landscape: This method is not called.
*/
- (BOOL) splitViewController:(UISplitViewController *)splitViewController
collapseSecondaryViewController:(UIViewController *)secondaryViewController
ontoPrimaryViewController:(UIViewController *)primaryViewController
{
if (self.masterNavController.topViewController)
{
return YES;
}
return NO;
}