Ios 如何以编程方式将样式应用于所有UIView
我有一个类定义UIVIew上的所有样式。 它们都是预定义的,但我不确定什么时候启动 当我尝试为此创建扩展时:Ios 如何以编程方式将样式应用于所有UIView,ios,swift,uiview,Ios,Swift,Uiview,我有一个类定义UIVIew上的所有样式。 它们都是预定义的,但我不确定什么时候启动 当我尝试为此创建扩展时: extension UIView { func willMoveToSuperview(newSuperview: UIView?) { self.stylize() // Another extension somewhere (not here my problem) } } 我得到一个错误: 带有Objective-C选择器的方法“will
extension UIView
{
func willMoveToSuperview(newSuperview: UIView?)
{
self.stylize() // Another extension somewhere (not here my problem)
}
}
我得到一个错误:
带有Objective-C选择器的方法“willMoveToSuperview”与冲突
使用相同的Objective-c选择器预览声明
我曾试图推翻它,但也没有奏效
关于如何在我的所有UIView都可见时应用相同行为的任何想法?即使Swift的
扩展类似于Objective-C中的类别,您尝试的操作在Swift中是不允许的
您不能覆盖现有功能:
扩展可以向类型添加新功能,但不能覆盖现有功能
资料来源:
根据您试图设置的样式,您可能需要查看ui外观
,它将允许您设置ui导航栏
的默认颜色。NSHipster对此有一篇很好的帖子:您可以使用.style()
方法创建UIView
的子类。
然后,您创建的每个视图都继承了您的UIView
子类
您可以在每个UIViewSubclass上调用.style()
。只需在子类中编写样式代码并继承即可
或
使用类别将方法添加到现有的UIView
类。
请参阅:您可以使用Swizzling技术自定义UIView的功能。看看:
- (目标-c)
或
- (swift)
希望这能有所帮助。除了swizzling(通常不推荐)或David在回答中提到的子类化之外,没有真正的方法覆盖类及其子类上的现有方法
您可以尝试的一件事是为视图控制器而不是所有视图创建基类。在视图控制器基类中,可以重写viewWillLayoutSubviews
以在视图层次结构中递归,并在每个视图上调用样式化
。这意味着您将在更少的地方使用子类方法(仅使用视图控制器,而不是所有视图)
如果你使用UIView的子类方法,你可以考虑的另一件事是,如果你是子类的话,你可以利用诸如@ IbDebug和@ iBiStEdTebe这样的东西来更好地将这些UIVIEW子类与故事板和实时预览集成。
我写了一个Swift库,它正好做到了这一点,而且它对于您想要做的样式类型非常有效:这迫使我每次需要使用它时都从它继承,我的一些类仅在情节提要上。我给了您两个解决方案。事实上,您总是从类继承。NSObject、UIView、UIViewCOntroller等。您只需从MyStylizedView而不是UIViewView继承您的视图。如果我只在情节提要上创建它,我不需要为此创建类,它由xcode管理,我不需要显式创建类。这种方法会迫使我(对于每一个拥有类的UIView)仅仅为了能够应用样式。你不会被迫在你拥有的每一个视图上都这么做。仅在要使用代码设置样式的视图上。它与storyboard dude完美结合。我试图避免混用Objective-C,但可能没有其他方法捕捉此事件。这并不是那么简单,我尝试注册样式并给出元素名称,以支持嵌套样式。我需要能够捕捉willMoveToSuperview事件并启动它。它不需要是一个扩展。我只是不知道它什么时候会变得可见。就是这样!非常感谢。如果您感兴趣,请看一看(具有可组合和可重用样式的样式化微框架)的实现示例。