2017-05-18 4 views
1

ビューコントローラでIBOutletsをスタイルするための一般的なwillSetクロージャを作成することは可能ですか?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の仕組みを十分に理解していないでしょう。だから親愛なるスウィフトの指導者、私に鋭い開発者になる方法を教えてください。

私は別の考えを持っていたパウロ・マトスから2番目の提案に基づいて更新

。すべての画像ビューを含むアウトレットコレクションを作成しました。それから私は、単にコードのこの素敵な小さな作品で、それぞれ1を着色、それらのすべてを反復処理:

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

このアプローチの素晴らしい事はあなたが基本的に着色のための1つ、1のような様々な目的のためにコンセントコレクションを作成できること、ですテキストサイズなどを指定し、スタイルを設定したいビューを適切なコレクションに接続するだけです。

+0

甘い:)そして、あなたは多くの*スタイルをカバーすることができます*このデザインで*。結果として得られる設定は、Interface Builderでも常に表示されます。 –

答えて

1

あなたの解決策は、私にはかなりのミニマムを感じています。私は、その周りの短いハックを思いつくことはできません。これは、ややエキゾチックなSwift Evolution proposalが助けになるかもしれませんが、少なくとも延期されました。

UIViewのサブクラス

レッツ・迅速willSetを超えたいくつかの選択肢を(おそらく...とにかく、このためにdownvotedするつもり)探ります。私はUITextFieldを持っています。私は多くのアプリで使いました!このように、私は単純なサブクラスを実装し、(表示されている各ビューコントローラの代わりに)すべてのスタイリングを行いました。もちろん、これはすべてあなたの意見で実行可能ではないかもしれません。

viewDidLoad。配列内のすべてのビューをグループ化し、viewDidLoadメソッド内でスタイリングを行うことができます。もっとエラーが発生する可能性があります - あなたは現在の解決策よりも見逃すかもしれませんが、あまりにも多くのハッキングなしで仕事を得ます;)

+0

右のカスタムサブクラスを使用すると、サブクラスで行われている場合にはそれらをまったく色づける必要はなくなりますが、それには他の弱点があります。あなたの2番目の提案は私に別のアイデアを与えました。 :私は私の元のポストを更新させて – xxtesaxx

関連する問題