自定义特征传播在视图层次结构之外无法按预期工作

问题描述 投票:0回答:1

我正在尝试构建自定义样式的组件,这些组件可以处理从上面传播的自定义特征并相应地调整其样式。例如:

class CustomButton: UIButton {
    override init(frame: CGRect) {
      super.init(frame: frame)

      self.registerForTraitChanges([DangerStyleTrait.self]) { (self: Self, _) in
            // Do some styling changes if danger is true or not
      }
    }
}

我想在其他组件中使用这些组件:

class InfoViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = CustomButton()
        view.addSubview(button)
        // <Button layout elided>
    }
}

在我通常的场景中,自定义特征将在演示之前应用:

func showWarningAlert() {
    let viewController = InfoViewController
    viewController.traitOverrides.dangerStyleEnabled = true
    present(viewController, animated: true)
}

但是上面的方法不行!该按钮永远不会收到特征更改更新,因此永远不会应用危险样式。我假设一旦视图控制器的视图添加到层次结构中,更新就会发送到按钮。

如果这是预期行为,是否有针对上述情况的解决方法?我希望这是一个合理的用例,希望设置一个完整的视图控制器,然后应用一个特征并让它在演示文稿中一路传播。

谢谢!

ios swift uikit uitraitcollection
1个回答
0
投票

这并非特定于自定义特征。

特质没有改变。它从一开始就在那里。除了检查更改之外,您的

CustomButton
实现还应该从一开始就检查其特征集合。

无论您的

CustomButton
类中有什么设置代码,都需要从一开始就考虑影响其外观的任何特征。

注册特定特征更改是为了允许视图在特征更改后自行更新。

© www.soinside.com 2019 - 2024. All rights reserved.