如何以编程方式将样式应用于所有UIViews

时间:2016-06-07 08:41:25

标签: ios swift uiview

我有一个定义UIVIew上所有样式的类。 它们都是预定义的,但我不确定何时开火。

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

extension UIView
{
    func willMoveToSuperview(newSuperview: UIView?)
    {
        self.stylize() // Another extension somewhere (not here my problem)
    }
}

我收到了这个错误:

  

与Objective-C选择器冲突的方法'willMoveToSuperview'   使用相同的Objective-c选择器预览声明

我试图覆盖它,但也没有用。

当我的所有UIViews都可见时,有关如何应用相同行为的任何想法?

4 个答案:

答案 0 :(得分:1)

您可以使用Swizzling技术来自定义UIView的功能。看看:

希望有所帮助。

答案 1 :(得分:0)

尽管Swift的Extensions与Objective-C中的Categories类似,但您在Swift中不允许执行此操作。

您不能override现有功能:

  

扩展程序可以为类型添加新功能,但它们无法覆盖现有功能。

来源:Swift Extensions - Apple Documentation

根据您尝试设置的样式,您可能需要查看UIAppearance,它将允许您为UINavigationBar设置默认颜色等。 NSHipster有一篇很好的帖子:NSHipster - UIAppearance

答案 2 :(得分:0)

您可以使用方法UIView创建.stylize()的子类。 然后,您创建的每个视图都继承了UIView子类。

您将能够在每个UIViewSubclass上调用.stylize()。只需在子类中编写样式代码并继承。

或者

使用类别将方法添加到现有的UIView类。

请参阅:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html

答案 3 :(得分:0)

除了大卫在他的回答中所指出的混合(通常不推荐)或子类化之外,还没有一种方法可以覆盖类及其子类上的现有方法。 / p>

您可能尝试的一件事是为视图控制器而不是所有视图创建基类。在视图控制器基类中,您可以覆盖viewWillLayoutSubviews以递归视图层次结构并在每个视图上调用stylize。这意味着您将在更少的位置使用子类方法(只是视图控制器而不是所有视图)。

如果将子类化方法与UIView一起使用,你可能会考虑的另一件事是,无论如何你都是子类化,你可以利用像@IBDesignable和@IBInspectable这样的东西来更好地将这些UIView子类与故事板和实时预览集成。

我写了一个完全正确的Swift库,它适用于你想要做的样式类型:https://github.com/daniel-hall/Stylish