IBOutletCollectionをNSMutableArrayにする
2021/01/12
同種のViewを配列で扱えるIBOutletCollectionは、普通に使うと変更できないNSArrayになります。ボタンのコレクションを宣言するとこんな感じ。
@property (nonatomic) IBOutletCollection(UIButton) NSArray<UIButton *> *buttons;
これをMutableにしたくて書き換えて実行すると、メソッド呼び出しでエラーになります。
@property (nonatomic) IBOutletCollection(UIButton) NSMutableArray<UIButton *> *buttons;
-[__NSArrayI sortUsingDescriptors]: unrecognized selector sent to instance 0x6000002211e0
NSArrayにはこんなメソッドないと言ってます。そう、Immutableなままなんですね。
実はMutableになるかどうかはStoryboardのソースコードにcollectionClass=”NSMutableArray”があるかどうかで決まります。例えば、プロパティ宣言したコレクションに2種類のボタンを登録するとこうなります。
<connections>
<outletCollection property="immutableButtons" destination="tau-0k-GrV" id="8Lt-9w-0q9"/>
<outletCollection property="immutableButtons" destination="JzQ-oO-QB5" id="URQ-Yp-crw"/>
<outletCollection property="mutableButtons" destination="tau-0k-GrV" collectionClass="NSMutableArray" id="Vic-tH-SYR"/>
<outletCollection property="mutableButtons" destination="JzQ-oO-QB5" collectionClass="NSMutableArray" id="2NV-P5-Fwc"/>
</connections>
自分でソースコードに追加しなくてもエラーにならなけれは自動的に付与されていると思います。
このようにOutletCollectionはMutableにもできますが、個人的にはNSArrayのままで扱うように心がけています。Mutableに変更した場合はStoryboardも確認しないとだめですし、そういった仕組みすら忘れてしまう危険があるので(^^;