我最近将一个应用程序从模态 viewControllers
转换为 TabBarController
,并且有一些代码在转换之前可以正常工作,但现在我很难制作它可以在 TabBar 应用程序中使用。
我想要做的是根据UserDefaults
中存储的用户设置更新选项卡中的UI
,这些设置发生在设置
中选项卡(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
。
编辑:
我的问题是我正在重新定位我的观点,但我并没有将它们重新定位回原来的位置。我知道这听起来很愚蠢,但我被一个事实所欺骗:当我在更改为 UITabBar 之前从
。我最终从 ViewDidLoad
调用 customizeApp()
时,完全相同的代码工作正常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
}
谢谢
最佳答案
请注意,“它不起作用”确实没有帮助。如果您需要帮助,您需要详细描述您的代码做什么或不做什么。
您的代码存在一些问题。
在 viewDidLoad()
、viewWillAppear(_:)
和 viewWillDisappear(_:)
中,您必须始终调用 super。
更新约束上的常量不会执行任何操作,直到下次更新 View 的布局为止。
当您在 viewDidLoad()
中更改布局约束时,它会在布局最终确定之前发生,因此更改将应用到下一个布局过程中。
如果要更改约束,则需要调用layoutIfNeeded()
。尝试将其添加到您的 customizeApp()
函数中:
func customizeApp() {
defer {
self.view.layoutIfNeeded()
}
}
关于ios - 为什么从 viewWillAppear 或 viewDidAppear 中显示和隐藏 View 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44700168/