XCode4でのnib編集時のTarget/Actionの扱い

以前のInterfaceBuilderで使っていたテクニックが使えなくなっていた。

InterfaceBuilderではtarget/actionパラダイムで接続出来るクラスは、以下の4つのメソッドがヘッダに定義されていれば問題なく使えた。

- (id)target;
- (void)setTarget:(id)anObject;
- (SEL)action;
- (void)setAction:(SEL)aSelector;

上記の4つのメソッドの有無で、IBActionConnectionでコネクションを張れるかどうかを判断していたらしい。

XCode4でこのテクニックは使えない。代わりに以下のような手法を使う。

  1. actionセレクタを文字列で設定するメソッドを追加する

    - (void)setActionName:(NSString*)inActionName
    {
        self.action = NSSelectorFromString(inActionName);
    }
    
    - (NSString*)actionName
    {
        return NSStringFromSelector(_action);
    }
    
  2. ヘッダにtargetをIBOutletを付ける

    @property (retain) IBOutlet id target;
    
XCode4上のUIエディターで通常のconnectionとして接続する事でtargetの設定が出来きる。
  1. XCode4上でセレクタ名を設定する

“Identify Inspector”の”User Defined Runtime Attributes”に

key Path actionName
Type String
Value <selectorNameString>

と設定する。これで、nibの読込み完了時にactionが設定される。