Ios 如何确保细节视图控制器始终嵌入到UINavigationController中?
我有一个Ios 如何确保细节视图控制器始终嵌入到UINavigationController中?,ios,swift,uisplitviewcontroller,Ios,Swift,Uisplitviewcontroller,我有一个UISplitViewController,它有一个preferredDisplayMode=.AllVisible。是如何设置情节提要的,请注意细节视图控制器是如何嵌入到UINavigationController中的 当在主视图控制器的工具栏中点击特定按钮时,我执行以下方法: @IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) { self.showDetailViewContr
UISplitViewController
,它有一个preferredDisplayMode=.AllVisible
。是如何设置情节提要的,请注意细节视图控制器是如何嵌入到UINavigationController
中的
当在主视图控制器的工具栏中点击特定按钮时,我执行以下方法:
@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {
self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController, sender: sender)
}
现在,这在iPhone的纵向模式下可以正常工作,但在iPhone 6+的横向模式下,我看不到细节视图控制器(刚才显示的)的导航栏。这不是我想要的行为。请注意,默认的详细视图控制器嵌入在UINavigationController
中,因此可以想象,当navigationBar
突然丢失时,它看起来不一致
因此,我尝试以下方法:
@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {
self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("NavigationSearchViewController") as! NavigationSearchViewController, sender: sender)
}
现在,我用与以前相同的VC替换我的详细视图控制器,但它被嵌入到UINavigationController
中。该行为在6+的横向模式下正常工作,因为它显示导航栏
但在纵向模式下,我看到了异常行为,因为现在随着新VC被推到堆栈中,我看到原始细节视图控制器上的工具栏消失了,导致了一个奇怪的过渡,显然有些地方出了问题
如何正确使用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
}
我目前看到了相同的行为。是的,实现委托:
- (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;
}
问题可能是您的UISplitViewController委托方法
splitViewController:separateSecondaryViewControllerFromPrimaryViewController:
@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {
self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController, sender: sender)
}
但你没有表现出来
我怀疑它返回的是detailView控制器,而不是包含它的导航控制器 更新了原始帖子,我不确定masterNavController在您的上下文中是什么。