ビューコントローラで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のような様々な目的のためにコンセントコレクションを作成できること、ですテキストサイズなどを指定し、スタイルを設定したいビューを適切なコレクションに接続するだけです。
甘い:)そして、あなたは多くの*スタイルをカバーすることができます*このデザインで*。結果として得られる設定は、Interface Builderでも常に表示されます。 –