Ios self.tabbar控制器有时为零
我有UIViewController,它的底部有选项卡栏。我在这个控制器中有下一个代码: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
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控制器中。确切原因取决于您的控制器层次结构和您如何处理键盘。我仍然不明白为什么会这样在选项卡栏中,在显示另一个之后,返回到这个位置,它不在:我可以在晚上添加屏幕截图。对于故事板,我会向上箭头以减轻您的痛苦。但是我有更多的视图控制器。我想这是一个问题:好的,谢谢,伙计。当您上传故事板的屏幕截图时,我会查看它。