ios - 为什么从 viewWillAppear 或 viewDidAppear 中显示和隐藏 View 不起作用

标签 ios swift uitabbarcontroller viewwillappear

我最近将一个应用程序从模态 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/

相关文章:

ios - iPhone 模拟器 3.2 (iPad) 中的核心位置

ios - 当 @State var 根据选取器选择发生更改时,一个 View 不会重新渲染

ios - 导航栏隐藏在viewwillappear后显示

swift - 在函数中重新声明变量

ios - 加载后是否可以更改 UITabBarController 文本颜色?

ios - 多个 View ViewDidLoad

ios - 带有自定义色调的 searchController.searchBar 上方和下方的黑线

ios - 数组中的 UILabels 未显示在 ViewController 上

swift - 尝试将数据从第二个选项卡栏项目发送到第一个选项卡栏项目,然后返回到第一个选项卡栏项目,我该怎么做?

ios - 我想要一个没有 UITabBar 的 UITabBarController