【发布时间】:2017-06-22 13:01:10
【问题描述】:
我最近将一个应用程序从模态 viewControllers 转换为 TabBarController 并且有一些代码在转换之前可以正常工作,但现在我很难让它在 TabBar 应用程序中工作。
我想做的是根据存储在UserDefaults 中的用户设置更新标签中的UI,这些设置发生在Settings 选项卡(ViewController)中,我想在不同的选项卡中更新 UI基于用户设置的设置。在转换之前,代码位于ViewDidLoad 中,并且工作正常,但现在TabBar 没有ViewDidLoad 我正在使用viewWillAppear,一旦标签被激活但不工作就会更新。
这里是代码...
class UserInputViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
// customizeApp() // everything works if called from here
}
override func viewWillAppear(_ animated: Bool) {
customizeApp() // Doesn't work
}
override func viewDidAppear(_ animated: Bool) {
// customizeApp() // Doesn't work
}
func customizeApp(){
if isView1(){
view1.isHidden = false
}else{
view1.isHidden = true
}
if isButton1(){
button1.isHidden = false
}else{
button1.isHidden = true
}
if isTextField1(){
textField1.isHidden = false
}else{
textField1.isHidden = true
}
if isTextField2(){
textField2.isHidden = false
}else{
textField2.isHidden = true
}
/// Adjust Screen based on settings
if textField1.isHidden && textField2.isHidden{
constraintMainButton.constant = 7
return
}
if textField1.isHidden {
constraintMainButton.constant = 45
}
if textField2.isHidden {
constraintMainButton.constant = 45
}
}
func isView1()->Bool{// read UserDefaults}
func isButton1()->Bool{// read UserDefaults}
func isTextField1()->Bool{// read UserDefaults}
func isTextField2()->Bool{// read UserDefaults}
}
我也试过viewDidLayoutSubviews,但也没用。
知道可能出了什么问题吗?
仅供参考 - 所有值均来自 UserDefaults 的预期。
编辑:
我的问题是我正在重新定位我的观点,但我没有将它们重新定位回原来的位置。我知道这听起来很傻,但是当我从ViewDidLoad 调用customizeApp() 并更改为UITabBar 之前,我被完全相同的代码工作正常这一事实欺骗了。我最终从viewDidAppear() 方法调用customizeApp()。
class UserInputViewController: UIViewController{
/// ... Code
override func viewDidAppear(_ animated: Bool) {
customizeApp()
}
func customizeApp(){
/// ... Code
/// Adjust Screen based on settings
if textField1.isHidden && textField2.isHidden{
constraintMainButton.constant = 7
return
}
if textField1.isHidden {
constraintMainButton.constant = 45
return // added
}
if textField2.isHidden {
constraintMainButton.constant = 45
return // added
}
constraintMainButton.constant = 83 // added: Original Position
}
/// .... Code
}
谢谢
【问题讨论】:
-
总是在
viewWillAppear和其他人中调用super。否则你会破坏一切。 -
view1,button1, ... 来自哪里? -
好的。仅供参考,任何以 viewWill/viewDid 开头的东西,都必须调用 super。
-
作为一般规则,当覆盖 UIKit 类时,调用 super 除非文档明确说明不这样做。
-
正如@deadbeef 指出的,您应该添加:
super.viewWillAppear(animated)和super.viewDidAppear(animated)
标签: ios swift uitabbarcontroller viewwillappear