我有一个定义UIVIew上所有样式的类。 它们都是预定义的,但我不确定何时开火。
当我尝试为此创建扩展程序时:
extension UIView
{
func willMoveToSuperview(newSuperview: UIView?)
{
self.stylize() // Another extension somewhere (not here my problem)
}
}
我收到了这个错误:
与Objective-C选择器冲突的方法'willMoveToSuperview' 使用相同的Objective-c选择器预览声明
我试图覆盖它,但也没有用。
当我的所有UIViews都可见时,有关如何应用相同行为的任何想法?
答案 0 :(得分:1)
答案 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
类。
答案 3 :(得分:0)
除了大卫在他的回答中所指出的混合(通常不推荐)或子类化之外,还没有一种方法可以覆盖类及其子类上的现有方法。 / p>
您可能尝试的一件事是为视图控制器而不是所有视图创建基类。在视图控制器基类中,您可以覆盖viewWillLayoutSubviews
以递归视图层次结构并在每个视图上调用stylize
。这意味着您将在更少的位置使用子类方法(只是视图控制器而不是所有视图)。
如果将子类化方法与UIView一起使用,你可能会考虑的另一件事是,无论如何你都是子类化,你可以利用像@IBDesignable和@IBInspectable这样的东西来更好地将这些UIView子类与故事板和实时预览集成。
我写了一个完全正确的Swift库,它适用于你想要做的样式类型:https://github.com/daniel-hall/Stylish