【问题标题】:OverrideUserInterfaceStyle and willTransition not working in other classOverrideUserInterfaceStyle 和 willTransition 在其他类中不起作用
【发布时间】:2020-07-27 22:11:10
【问题描述】:

我正在尝试练习使用标签栏和导航控制器。但是,我发现 overrideUserInterfaceStyle 和 willTransition 在其他类中不起作用。我该如何解决?

这是我的代码,它可以完美运行:

class ViewController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupTabBar()
    }
    func setupTabBar() {
        let aTab = UINavigationController(rootViewController: AController())
        aTab.tabBarItem.image = UIImage(systemName: "cloud.sun.fill")
        aTab.tabBarItem.title = "A"

        let bTab = UINavigationController(rootViewController: BController())
        bTab.tabBarItem.image = UIImage(systemName: "calendar")
        bTab.tabBarItem.title = "B"

        let cTab = UINavigationController(rootViewController: CController())
        cTab.tabBarItem.image = UIImage(systemName: "text.badge.checkmark")
        cTab.tabBarItem.title = "C"

        let dTab = UINavigationController(rootViewController: DController())
        dTab.tabBarItem.image = UIImage(systemName: "gear")
        dTab.tabBarItem.title = "D"

        overrideUserInterfaceStyle = .dark // It has been called, working fine.
        
        viewControllers = [aTab, bTab, cTab, dTab]
    }
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        //This will working perfectly
    }
}

但是我创建了无法正常工作的新类,我错过了什么吗?这是我的代码:

class AController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "A"
        overrideUserInterfaceStyle = .dark // Will NOT called...
    }
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        //This will not working
    }
}
class BController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "B"
        overrideUserInterfaceStyle = .light // Will NOT called...
    }
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        //This will not working
    }
}
class CController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "C"
        overrideUserInterfaceStyle = .unspecified // Will NOT called...
    }
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        //This will not working
    }
}
class DController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "D"
        overrideUserInterfaceStyle = .unspecified // Will NOT called...
    }
    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        //This will not working
    }
}

【问题讨论】:

    标签: ios swift overriding ios-darkmode


    【解决方案1】:

    您是否将AControllerBController 等嵌入到另一个视图控制器中,例如ViewController,它设置了overrideUserInterfaceStyle?如果是这样,子视图控制器无法设置overrideUserInterfaceStyle,也不会在willTransition 中收到通知,因为它是在父视图中“捕获”并处理的。

    当视图控制器覆盖界面样式时,它也会影响所有子级。对于孩子来说,界面风格看起来永远不会改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2013-01-16
      相关资源
      最近更新 更多