IBOutletCollection
IBOutletCollecation は IBOutletを束ねて NSArray で扱えるようにした新し仕組み。iOS 4.0 より導入された。次のように宣言する。
@interface SomeController : UIViewController {
IBOutletCollection (UILabel) NSArray* labels;
}この例では複数の UILabel を NSArray で扱えるようにしている。( ) 内には NSArray で扱う型情報を指定する。複数の型が混在する場合は id の指定もできる。例えば Interface Builder で複数の UILabel で定義する。
設定の方法は従来と同じで一つ一つ接続していく。
複数接続すると Multipleと表示される。
一旦接続できればプログラムでこれらの UILabel をまとめて扱えるようになる。
for (UILabel* label in labels) {
labels.text = @"good!";
}サンプル
こんなサンプルを作ってみた。
#import <UIKit/UIKit.h>
@interface IBOutletCollectionSampleViewController : UIViewController {
IBOutletCollection (UILabel) NSArray* labels;
IBOutletCollection (UITextField) NSArray* textFields;
IBOutletCollection (id) NSArray* stuffs;
}
- (IBAction)dump;
- (IBAction)action;
@end接続はこんな感じになっている。ACTIONボタンを押すと次の処理を実行する。
- (IBAction)action
{
for (UITextField* textField in textFields) {
textField.text = @"Hello!";
}
for (UIControl* control in stuffs) {
control.enabled = !control.enabled;
}
}複数のコントロールに対してまとめて処理を行うことが容易にできる。ソースコード
GitHub からどうぞ。
IBOutletCollectionSample at 2010-11-29 from xcatsan/iOS-Sample-Code - GitHub
備考
- (void)awakeFromNib
{
NSLog(@"labels: %@", labels);
}awakeFromNib で IBOutletCollection 指定したオブジェクトをデバッグ表示したところ nil となっていた。IBOutletCollectionSample[16985:207] labels: (null)IBOutletCollection の充填は遅いようなのでここでの初期化処理は行えない。
参考情報
Interface Builder User Guide: Xcode Integration
IBOutletCollecation の記述が追加されている。







Responses
Leave a Response