Ios 如何以编程方式将样式应用于所有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

我有一个类定义UIVIew上的所有样式。 它们都是预定义的,但我不确定什么时候启动

当我尝试为此创建扩展时:

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事件并启动它。它不需要是一个扩展。我只是不知道它什么时候会变得可见。就是这样!非常感谢。如果您感兴趣,请看一看(具有可组合和可重用样式的样式化微框架)的实现示例。