[iOS] IBOutletCollection とは?

2010年11月29日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

twitter で iOS 4.0 から IBOutletCollection なるものが導入されたと小耳に挟んだので調べてみた。

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

人気の投稿(過去 30日間)