2014-09-04 75 views
4

我试图在Swift中创建一个MasterDetail应用程序,它在iOS8模拟器上运行良好。然而,当我试图在我的iOS 7.1的iPad,我得到这个错误:从DetailView的Swift导航UISplitViewController

**Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '- [UISplitViewController displayModeButtonItem]: unrecognized selector sent to instance** 

这是我AppDelegate.swift文件(Xcode中产生的,我没加任何东西):

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 
    let splitViewController = self.window!.rootViewController as UISplitViewController 
    let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as UINavigationController 
    navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem() 
    splitViewController.delegate = self 

    let masterNavigationController = splitViewController.viewControllers[0] as UINavigationController 
    let controller = masterNavigationController.topViewController as MasterViewController 
    controller.managedObjectContext = self.managedObjectContext 
    return true 
} 

的问题来自于这条线在其中创建左键:

navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem() 

当我删除这条线,它运行在iOS 7,但仅显示的DetailView。当我从左边缘滑动MasterView不会出现(在iOS 8模拟器上它),基本上没有导航到MasterView

有没有人有同样的问题?

谢谢!

+0

您对此问题有任何进展吗? – erdekhayser 2014-09-27 19:12:35

+0

不,我想你必须在Objective C中编写它以便在早期的IOS版本兼容 – 2014-10-03 18:08:30

回答

0

我有同样的问题。 displayModeButtonItem在IOS 8之前的IOS版本不支持。我怀疑你是在针对IOS 8进行编译,但在部署时将部署到安装了IOS 7.1的Ipad应用程序上。我已经在我的情况下解决了这种情况(因为我可以)在目标Ipad上安装IOS 8。然后它没有问题地工作。

+0

我也可以安装iOS 8,但那不是重点。我仍然希望部署目标至少为7.1甚至7.0。我已经设法在Objective-C中创建程序,它在iOS 7和8上运行良好,它只是没有利用iOS 8中的属性。 – 2014-09-12 13:03:28

2

您仍然可以在UISplitViewControllerDelegate中使用不推荐使用的回调函数来将UIBarButtonItem添加到您的IOS7平台的详细视图。在您的UISplitViewControllerDelegate中执行以下步骤

func splitViewController(svc: UISplitViewController, willHideViewController aViewController: UIViewController, withBarButtonItem barButtonItem: UIBarButtonItem, forPopoverController pc: UIPopoverController) { 
    if !self.respondsToSelector(Selector("displayModeButtonItem")) { 
     let navigationController = self.viewControllers.last as! UINavigationController 
     let detailViewController: UIViewController? = navigationController.viewControllers?.last as? UIViewController 
     barButtonItem.image = UIImage(named: "IC_BackArrow") 
     detailViewController?.navigationItem.leftBarButtonItem = barButtonItem 
    } else { 
     // This callback function is depreciated in IOS8. We use displayModeButtonItem. 
    } 
} 

func splitViewController(svc: UISplitViewController, willShowViewController aViewController: UIViewController, invalidatingBarButtonItem barButtonItem: UIBarButtonItem) { 
    if !self.respondsToSelector(Selector("displayModeButtonItem")) { 
     let navigationController = self.viewControllers.last as! UINavigationController 
     let detailViewController: UIViewController? = navigationController.viewControllers?.last as? UIViewController 
     detailViewController?.navigationItem.leftBarButtonItem = nil 
    } else { 
     // This callback function is depreciated in IOS8. We use displayModeButtonItem. 
    } 
} 
+0

不应该是.first? self.viewControllers.last作为UINavigationController – h4labs 2015-04-12 15:48:37

+0

。首先应该是UISplitViewController的主VC – hufeng03 2015-04-13 18:45:58

相关问题