2015-12-20 94 views
2

我的應用程序有一個TabBarViewController包含4個選項卡。其中一個標籤是我想要移至單獨故事板的設置。如果我只考慮iOS 9及以上作爲我的部署目標,那麼我可以使用Storyboard參考重構SettingsTab。不過,我想要定位iOS 8。由於Storyboard Reference不支持Relationship Segue,所以在這種情況下我不能依賴它。處理Relationship Segue時,iOS 8的「Storyboard Reference」的替代方案?

所以在包含TabBarViewController的主要故事板中,我保留一個虛擬的SettingsTabViewController作爲一個空的佔位符。在其類文件中的函數"viewWillAppear"中,我將視圖推送到Settings.storyboard中的實際SettingsTabViewController。這工作正常。但問題是,如果我保持Tab鍵的設置選項卡,空的佔位符視圖控制器將顯示一段時間,然後返回到真實的設置視圖。

我試圖執行此委託鎖定設置選項卡:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 

     return viewController != tabBarController.selectedViewController 

} 

然而,其他三個選項卡中太侷限於我實現了這個委託後。

是否可以鎖定設置選項卡而不鎖定其他三個選項卡?並且在哪個視圖控制器中我應該實現這個委託?

+0

「我試圖實現這個」 - 編輯你的問題,包括你的實現該方法。 –

+0

嘗試將調用移至'viewDidLoad'。 –

回答

1

是的,這是可能的。你需要檢查索引; 使用以下代碼不僅可以防止鎖定其他選項卡,而且還具有tap on tab goto root view controller功能。

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { 
    let tappedTabIndex = viewControllers?.indexOf(viewController) 
    let settingsTabIndex = 3 //change the index 
    if tappedTabIndex == settingsTabIndex && selectedIndex == settingsTabIndex { 
     guard let navVC = viewController as? UINavigationController else { return true } 
     guard navVC.viewControllers.count > 1 else { return true } 

     let firstRealVC = navVC.viewControllers[1] 
     navVC.popToViewController(firstRealVC, animated: true) 
     return false 
    } 
    return true 
} 

這會回答你的問題,但是你仍然有設置VC顯示一會兒。爲了避免這種情況,您只需在推動動畫時關閉動畫。所以您需要按照以下方式覆蓋viewWillAppear

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    if let theVC = storyboard?.instantiateViewControllerWithIdentifier("theVC") { 
     navigationController?.pushViewController(theVC, animated: false) 
    } 
} 

添加上面的代碼後,你仍然會看到你的真正的第一個viewController後退按鈕。你可以隱藏它:

override func viewDidLoad() { 
    super.viewDidLoad() 
    navigationItem.hidesBackButton = true 
}