回答:各ビューコントローラでhidesBottomBarWhenPushedの代わりにself.tabBarController?.tabBar.hiddenを使用して、ビューコントローラがタブバーを表示するかどうかを管理します。
override func viewWillAppear(animated: Bool) {
self.tabBarController?.tabBar.hidden = true/false
}
が欲しいです
ビューコントローラー1:タブバーを表示する必要があります
ビューコントローラー2:タブバーを表示する必要があります
ビューコントローラー3:タブバーは表示されません。
ビューコントローラー4:タブバーは表示されません。
私が書いた
// prepareForSegue in view controller 1,
let upcoming = segue.destinationViewController as! viewcontroller3
upcoming.hidesBottomBarWhenPushed = true
// in view controller 3,
func clickOnButton(button: UIButton) {
self.hidesBottomBarWhenPushed = false
self.performSegueWithIdentifier("viewController2", sender: self)
self.hidesBottomBarWhenPushed = true
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "viewController2" {
let upcoming = segue.destinationViewController as! viewController2
upcoming.hidesBottomBarWhenPushed = false
}
}
// prepareForSegue in view controller 2
let upcoming = segue.destinationViewController as! viewController4
upcoming.hidesBottomBarWhenPushed = true
1-> 3の場合、1に戻ります。
1-> 3-> 2の場合、3に戻り、1に戻ると機能します。
2-> 4の場合、2に戻ります。
1-> 3-> 2-> 4の場合、2に戻ると、タブバーは表示されません。なぜだろう。 hidesBottomBarWhenPushedの提案や説明は、私を非常に混乱させます。
名前が示すように、hiddenBottomBarWhenPushedは必要に応じてボトムバーのみを非表示にし、bottomBarを再表示しません。あなたはそれを機能させるためにこれを行うことができます:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.tabBarController?.tabBar.hidden = true/false
}
または単にself.tabBarController?.tabBar.hidden = true/false
in prepareForSegue
しかし、bottomBarが突然ポップアウトされると奇妙になるので、そうすることはお勧めしません。ユーザーは、突然、rootViewControllerに戻ったと思います。
ユーザーは常にアプリのどこにいるか、次の目的地に行く方法を知っている必要があります。
プッシュ/ポップ時にタブバーを非表示/表示するViewControllerにこの実装を追加します。また、次にプッシュされるすべてのView Controllerでも機能します。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if wilmove {
hidesBottomBarWhenPushed = true
}
wilmove = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if wilmove {
hidesBottomBarWhenPushed = false
}
wilmove = false
}
var wilmove = false
override func willMove(toParentViewController parent: UIViewController?) {
super.willMove(toParentViewController: parent)
wilmove = true
if !isViewLoaded {
hidesBottomBarWhenPushed = true
}
}
HidesBottomBarWhenPushedプロパティを宛先のビューコントローラーに追加し、trueに設定します。
プッシュの例VC with identifier:
let storyboard = UIStoryboard(name: STORYBOARD_NAME, bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: VC_IDENTIFIER) as! YourViewController
vc.hidesBottomBarWhenPushed = true
navigationController?.pushViewController(vc, animated: true)
これが私の2セントです。 Swift 3/4/5:
アプローチ1:(推奨)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "YourSegueIdentifier" {
let destinationController = segue.destinationViewController as! YourViewController
destinationController.hidesBottomBarWhenPushed = true // Does all the hide/show work.
}
}
アプローチ2:
override func viewWillAppear(_ animated: Bool) { // As soon as vc appears
super.viewWillAppear(true)
self.tabBarController?.tabBar.isHidden = false
}
override func viewWillDisappear(_ animated: Bool) { // As soon as vc disappears
super.viewWillDisappear(true)
self.tabBarController?.tabBar.isHidden = true
}