2017-05-18 24 views
1

是否有可能創建某種通用的willSet閉包來在視圖控制器中設置IBOutlets的樣式?在Swift中爲IBOutlets創建一個通用的willSet閉包

目前我使用此代碼來設置UIImageView設置後的色調。 「.primary」是我通過的UIColor擴展創建上的UIColor AA靜態變量:

@IBOutlet weak var someImageView:UIImageView! { 
    willSet { 
    newValue.tintColor = .primary 
    } 
} 

現在我有網點的一大堆,我想要的風格以同樣的方式對我來說這似乎是很多重複的代碼,特別是如果我開始應用更多的樣式,而不僅僅是設置色調,所以我想要更通用的東西。我想出了:

let tintClosure: (_ newValue: UIView?) ->() = { $0?.tintColor = .primary } 
@IBOutlet weak var someImageView:UIImageView! { willSet{ tintClosure(newValue) } } 

現在我必須編寫實際調色的代碼只能調用一次,並可以在willSet中調用閉包。然而,我想知道是否有更高效的方法,所以我甚至不必用(newValue)自己調用閉包,而只是給它添加tintClosure。

就像一個函數需要一個完成處理程序,並且您有一個適合其聲明的函數,並且只傳遞該函數的名稱而不是您在其中調用該函數的閉包。

東西真正看中的,如:

@IBOutlet weak var someImageView:UIImageView! { superDuperClosure(willSet) } 

@IBOutlet weak var someImageView:UIImageView! { willSet{ crazyImplementationOfTintClosre } } 

@IBOutlet weak var someImageView:UIImageView! { willSet.howIsThisEvenPossible } 

@IBOutlet weak var someImageView:UIImageView! { nowWeAreTalking } 

好吧,也許我只是想着頂端,我已經找到了最簡單的做法。也許我對willSet的工作原理還沒有深入的瞭解。所以親愛的Swift大師,教我如何成爲一個快速的開發人員。

更新

基於從聖保羅馬託斯我有另一個想法的第二個建議。我創建了一個包含所有圖像視圖的插座集合。然後我遍歷所有這些着色每一個與這個漂亮的一小段代碼:

@IBOutlet var imageViewsToTint: [UIImageView]! { willSet { newValue.forEach { $0.tintColor = .primary } } } 

這種方法的美妙的事情是,你基本上可以像一個着色創建各種用途的出口集合,一個對於文本大小等,然後你可以將你想要的風格的視圖連接到適當的集合。

+0

甜:)而且,如你所說,你可以涵蓋許多*風格*採用這種設計。並且生成的安裝程序在Interface Builder中也始終可見! –

回答

1

你的解決方案已經感覺很簡單:)我不能拿出一個較短的黑客周圍,對不起。這有點奇特,Swift Evolution proposal可以提供一些幫助,但現在至少推遲了。

讓我們快速探索超越willSet一些替代品(可能會是downvoted這一點,反正...):

UIView子類。我有一個UITextField,我用我的應用程序很多!因此,我實現了一個簡單的子類,並在那裏做了所有的樣式(而不是每個視圖控制器)。當然,這可能並不適用於你所有的全部你的意見。

viewDidLoad。您可以將所有視圖組合在一個數組中,然後在viewDidLoad方法中執行樣式。可能更多容易出錯比你目前的解決方案 - 你可能會錯過一個視圖在這裏和那裏 - 但得到的工作沒有太多黑客攻擊;

+0

正確的說,如果在子類中完成,使用自定義子類將消除對它們進行着色的必要性,但它帶來了其他缺點。你的第二個建議雖然給了我另一個想法。 :D讓我更新我原來的帖子 – xxtesaxx

相關問題