2016-06-07 56 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

相關問題