2014-09-04 74 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

相關問題