0

考慮一個storyboard,我們在其中有UITabBarController,其中包含嵌入UINavigationController中的任何UIViewController(讓它稱爲VC)。我們希望VC在其導航欄上有一個BarButtonItems。這個故事板是通過從另一個故事板(具有另一個導航控制器)推動segue呈現的。iOS故事板以模態方式呈現標籤欄並在XCode 8中推入

在XCode中一切都看起來不錯,但navigation bar does not change in VC at the runtime。然而,當我改變將這個故事板從推送到模態時,一切似乎都很好。恕我直言,這是因爲嵌入導航控制器,但我沒有看到任何理由爲什麼它不工作。任何想法如何合法地解決它(通過推送呈現)並且沒有任何痛苦將是有幫助的。

在此先感謝

回答

0

所以我認爲你將不得不使用一些代碼來解決您的問題,但並不多。我構建了一個測試項目來測試它,並將代碼附加圖像。 首先,如果我正確地理解了你,你有一個導航控制器推送有問題的新故事板。見附圖。 MainStoryboard

我命名故事板被推,因爲這就是發生了什麼。然後在我的故事板名爲Push這裏是設置。 Push.storyboard

在tabbarcontroller的第一個視圖控制器中,我添加了下面的代碼。顯然這隱藏了把我們推到這裏的導航控制器。如果您然後訪問控制器編號2我們新的導航控制器和項目顯示。如果隱藏導航控制器在tabbarcontroller視圖控制器1不是你想要做的那麼。繼續閱讀。

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    //or to unhide from returning the opposite ->self.parent?.navigationController?.isNavigationBarHidden = true 
    self.parent?.navigationController?.isNavigationBarHidden = true 
} 

如果你不想隱藏在第一視圖控制器導航控制器,但訪問控制器2,當你想看到你的項目,然後添加到您的viewWillAppear中,並在viewWillAppear中第一控制器改變從代碼真假。

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // Do any additional setup after loading the view, typically from a nib. 
    self.parent?.navigationController?.isNavigationBarHidden = true 
} 

這隱藏了父導航控制器,基本上就是在您的示例中隱藏了導航控制器。所以上面隱藏了父導航控制器。這也是爲什麼呈現模態工作。您的導航控制器從一開始就隱藏起來。希望這可以幫助。

**編輯 如果你想要導航控制器在選項卡2視圖控制器,但你想保持父母在選項卡之一能夠返回與後退按鈕,你可以設置它在viewWillAppear,而不是所以它會看起來像這個在視圖控制器1中。

//tabcontroller vc 1 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.navigationController?.isNavigationBarHidden = false 
} 

而在帶有欄中項目的tabcontroller視圖控制器2中,您可以執行此操作。 // tabbarcontroller vc 2 with own navigationcontroller override func viewWillAppear(_ animated:Bool){ super.viewWillAppear(animated) self.parent?.navigationController ?.isNavigationBarHidden =真 }

最後,如果你想在兩個控制器可見背部按鈕,但希望不同的右按鈕做編程在viewWillAppear中

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
     self.tabBarController?.navigationItem.setRightBarButton(UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(FirstViewController.editSomthing)), animated: true) 
} 

如果你想在其他控制器中刪除它

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.tabBarController?.navigationItem.rightBarButtonItem = nil; 
} 

在上面這兩個例子中,我們保留父導航控制器,所以你不需要在uinavigati中嵌入你的視圖控制器的tab控制器在控制器上。

如果您還想在viewWillAppear中隱藏/顯示父級導航控制器,也可以使用上述代碼的組合。其中一些依賴於您現在和將來選擇的視圖層次結構。

+0

不錯,但它也隱藏父導航欄中的後退按鈕。所以在這個解決方案中缺少一些東西:) – gbread

+0

更新答案讓你更加自由。可能需要使用不同的組合,並且可能需要故事板更改,或者可能會降低應用程序的開銷。 – agibson007

+0

欣賞你回到此並測試和標記正確。可能爲什麼我三年沒有回答很多問題。 :) – agibson007