はじめに
InterfaceBuilderの要素をコードと紐づけるために、IBOutlet、 IBActionが使われます。 ただ、複数の共通要素に対してはIBCollectionを使用すると便利です。 自分用のメモをかねて、IBCollectionに関してまとめます。
環境設定
以下の環境を使用しています。
- Xcode10.0
- iOS 12.0
IB要素の定義
IBOutlet - View要素とコードとの紐付け IBAction - ButtonのAction - Target紐付け IBOutletCollection - 複数View要素とコードとの紐付け
それぞれ、 UINibDeclarationsに以下のように定義されています。
#define IBOutlet #define IBAction void #define IBOutletCollection(ClassName) // IBInspectable, IB_DESIGNABLEも定義されています #define IBInspectable #define IB_DESIGNABLE
IB Outlet Collection
IBOutlet, IBActionはStoryboard, Xibから紐づけることがおおいかと思います。 IBOutletCollectionも同様にStoryboard, Xibから紐づける際にIBOutletCollectionを選択して紐づけることが可能です。 またIBOutletCollectionはコード側に記載し、それをStoryboard,Xibとひもづけることもできます。
@IBOutlet var buttons: [UIButton]!
IBOutlet, IBActionはweakで紐付けられることが多いですが、 IBOutletCollectionは弱参照では定義できないので注意が必要です。 ※配列による強参照での保持は問題ないのか、という疑問があります。このあたりご存知の方がいらっしゃいましたら共有ください。
格納順
IBOutletCollectionと紐づけた順で格納されていました。 ただ、この辺りはOS versionによって変わる可能性があるので、 tag等で並び替えできるようにしておいた方が安全かもしれません。
まとめ
似たような複数のView要素をIBOutletで接続すると、コードが煩雑になるため、 必要に応じてIBOutletCollectionを使用するとコードがスッキリします。