Ios self.tabbar控制器有时为零

Ios self.tabbar控制器有时为零,ios,swift,swift3,uikit,uitabbarcontroller,Ios,Swift,Swift3,Uikit,Uitabbarcontroller,我有UIViewController,它的底部有选项卡栏。我在这个控制器中有下一个代码: let tabBarHeight = self.tabBarController?.tabBar.frame.size.height 它工作得很好,但当我从第一个控制器转到下一个一秒控制器,然后按下后退按钮并返回到第一个控制器时,self.tabBarController为零。为什么会这样?我只有一个版本,那就是控制器堆栈过于拥挤 我怎样才能解决这个问题?我需要这个高度来为keyboardWillShow

我有UIViewController,它的底部有选项卡栏。我在这个控制器中有下一个代码:

let tabBarHeight = self.tabBarController?.tabBar.frame.size.height
它工作得很好,但当我从第一个控制器转到下一个一秒控制器,然后按下后退按钮并返回到第一个控制器时,self.tabBarController为零。为什么会这样?我只有一个版本,那就是控制器堆栈过于拥挤

我怎样才能解决这个问题?我需要这个高度来为keyboardWillShow函数中的约束更改计算一些值

更新:

我如何称呼它:

// MARK: - Scroll view on keyboard show/hide
extension CommentariesController: UITextFieldDelegate {
    func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
           let keyboardHeight = keyboardSize.height
           let tabBarHeight = self.tabBarController?.tabBar.frame.size.height
           UIView.animate(withDuration: 1.0, animations: {
               self.newCommentViewBotConstraint.constant = -keyboardHeight + tabBarHeight!
               self.view.layoutIfNeeded()
           })
        }
    }

    // other code 
}
更新2:

我可以看到标签栏。但它是零

具有显示顺序的结构:选项卡栏->导航栏->视图控制器->视图控制器->视图控制器第一->视图控制器第二


感谢iOS>=8.0上的,选项卡栏高度始终为49磅,请参见

如果您需要一些复杂的UI用例来解决tabbar不可访问的问题,只需将该数字输入常量并使用它,例如:

let tabbarHeight: CGFloat = 49.0
或者,将值保存到变量,例如

var tabbarHeight:

viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated: animated)

    self.tabbarHeight = self.tabBarController!.tabBar.frame.size.height
}
TabBar控制器设置为根,然后导航控制器设置为TabBar的项之一,TestViewController设置为该导航控制器的根。然后,这个TestViewController有一个文本字段来检查keyboardWillShow功能,点击UIButton-button按钮,就会按下新的viewcontroller。再次点击键盘将显示函数self.tabBarController不是nil,我得到了该函数中tabBar的正确高度

 NotificationCenter.default.addObserver(self, selector: #selector(TestViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)


    extension TestViewController {
    func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = keyboardSize.height
            let tabBarHeight = self.tabBarController?.tabBar.frame.size.height
            UIView.animate(withDuration: 1.0, animations: {
                print("tabBarheight - \(tabBarHeight)")

            })
        }
    }

}

这只是偶尔发生吗??其中,我已经描述了“viewwillbeen”中nil中的tabBarController或viewDidLoad???@Bilal仅在这种情况下出现。此处:扩展注释控制器:UITextFieldDelegate{func keyboardWillShownotification:NSNotification{你试过在keyboardWillShow中调用它吗?那应该没问题。如果你在ViewController出现在屏幕上之前尝试调用self.tabBarController,它可能会返回nil,我想这就是你的情况。@TawaNicolas我总是在keyboardWillShow中调用它。你打算如何调用下一个视图控制器,你是否正在推它。在Ipad上,它也会返回nil49岁?主要问题是为什么会这样,以及如何解决。无论如何,谢谢你的回答和建议time@VladPulichev发生这种情况是因为您的控制器不在过渡期间正常的任何tabbar控制器中。确切原因取决于您的控制器层次结构和您如何处理键盘。我仍然不明白为什么会这样在选项卡栏中,在显示另一个之后,返回到这个位置,它不在:我可以在晚上添加屏幕截图。对于故事板,我会向上箭头以减轻您的痛苦。但是我有更多的视图控制器。我想这是一个问题:好的,谢谢,伙计。当您上传故事板的屏幕截图时,我会查看它。