我已经将UIViewController
子类化为启用主题策略。
也就是说,我的所有UIViewControllers
扩展了名为MyUIViewController
的版本override
viewWillLayoutSubviews
。因此,当页面加载时,我可以调用我的setupView
方法,这将为我正确设置我的背景和其他样式和动画。
我为UITextField
做了同样的事情。然而,我遇到的问题是,我无法在UITextField
类中找到每次出现视图时调用的方法。
基本问题是,UITextFields
viewWillLayoutSubviews
或viewDidLoad
是什么。
部分解决方案:
如果没有任何东西被调用,我有以下解决方案,我不喜欢。
使用ViewController
,遍历视图控制器具有的所有子视图,如果给定视图的类型为UITextField
,则在我的扩展中调用静态方法来设置其式
将我的子类UITextField
注册到通知中心,当我更改主题时,发出通知。
我已经测试了上面的两种方法并且它们确实有效,但它们并不像让类本身在视图中做它需要做的那样好。
总结一下,我想知道是否有一种方法可以在UITextField
类中覆盖,每当视图生效时都会通知我。
答案 0 :(得分:2)
方法func didMoveToSuperview()
继承自UIView
类,只是覆盖它,并检查superview
值是否与nil
不同,这需要子类{{1 }}。
讨论此方法的默认实现不执行任何操作。 子类可以覆盖它,以便在每次执行时执行其他操作 超视变化。
但在我看来,你过于复杂,你能解释一下你想用文本字段做些什么吗?
的 [UPDATE] 强>
要将主题应用于整个视图控制器视图,您可以执行许多操作。使用UItextField
和NSNotification
查看控制器的简单方法。
当您的视图控制器加载了视图时,将调用viewDidLoad()
方法,这意味着如果您不在运行时添加视图,那么您的UI也将在此时加载。在这里,您可以调用方法viewDidLoad()
- 当然,您需要以某种方式传递ThemeObject - 您可以在其中应用子视图自定义。如果要在运行时更改主题,您还可以使用applyTheme(theme:ThemeObject)
并在用户选择主题后调度其中一个主题。所有注册的观察员都可以调用NSNotification
方法并添加他们的自定义
如果你想稍微抽象一下这个行为,你可以创建一个协议" Themable "并在协议扩展中为每种applyTheme(theme:ThemeObject)
子类添加实现。
我只想记住,UIKit提供了一个名为UIApperence的类似协议,通过谷歌搜索你可以找到custom implementations,它真的是一个非常强大的协议值得一看。< / em>的