2016-06-07 31 views
2

我有一个类定义了UIVIew上的所有风格。 它们都是预定义的,但我不确定何时触发此操作。如何以编程方式将风格应用于所有UIViews

当我尝试这个创建扩展:

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

而且我得到这个错误:

Method 'willMoveToSuperview' with Objective-C selector conflicts with previews declaration with the same Objective-c selector

我试图覆盖它,但没有任何工作。

当我所有的UIViews变得可见时,如何能够应用相同的行为的任何想法?

回答

0

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

不能override现有功能:

Extensions can add new functionality to a type, but they cannot override existing functionality.

来源:Swift Extensions - Apple Documentation

取决于它是什么,你正在尝试的风格,你可能想看看UIAppearance,它可以让你以设计UINavigationBar等默认颜色。 NSHipster有一个好帖子:NSHipster - UIAppearance

+0

这不是那么简单,我想注册样式,给的名字例如,支持嵌套样式的元素。我需要能够捕捉到willMoveToSuperview事件并将其触发。它不需要是一个扩展。我只是不知道它何时会变得可见。 – Brduca

0

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

您可以在每个UIViewSubclass上调用.stylize()。只需在子类中写入样式代码并继承。

或者

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

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

+0

这迫使我每次需要使用它时继承它,我的一些类只能在故事板上使用。 – Brduca

+0

我给你2个解决方案。 事实是,你总是从一个班级继承。 NSObject,UIView,UIViewCOntroller等 你只需要继承你的视图形式MyStylizedView比UIView –

+0

如果我只创建这个故事板上,我不需要创建一个类,它由Xcode管理,我不需要为此明确创建一个类。这种方法会迫使我(仅仅为了每个UIView都有一个类)能够应用样式。 – Brduca

0

在混搭(通常不推荐)或子类化之外,David在他的回答中指出,在类和它的子类中,并没有真正的方法来覆盖现有的方法。

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

如果采用UIView的子类化方法,您可能会考虑的另一件事是,如果您是继承子类,则可以利用@IBDesignable和@IBInspectable之类的优势来更好地将这些UIView子类与故事板和实时预览进行集成。

我写这不正是这样的斯威夫特库,它可以很好地用于它似乎你想要做造型的类型:https://github.com/daniel-hall/Stylish

相关问题