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