UIButtonなどのUIControlクラス(or継承)で、割り当てられているメソッドを削除して新しいメソッドを割り当てる方法です。
例えば、Appleが実装し用意しているViewControllerとそれに追加されてUIButtonがあるとします。
このUIButtonが呼び出している何だかわからないメソッドを削除し任意のメソッドを呼び出すようにしたくてやりました。
サンプルコード
仮でUIViewController *targetVC
とUIButton *buttonで
説明します。
UIViewController *targetVC = [[UIViewController alloc] init];
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
[button addTarget:targetVC action:@selector(action1) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:targetVC action:@selector(action2) forControlEvents:UIControlEventTouchUpInside];
/* 以下でbuttonのアクションを削除します */
// targetVCをターゲットにしたUIControlEventTouchUpInsideイベントに割り当てられている全SEL名を取得する
NSArray *sels = [button actionsForTarget:targetVC forControlEvent:UIControlEventTouchUpInside];
NSLog(@"sels %@", sels);
for (NSString *selName in sels) {
// targetVCをターゲットにしたUIControlEventTouchUpInsideイベントに割り当てられているselNameのアクションを削除する
NSLog(@"remove selName %@", selName);
[button removeTarget:targetVC action:NSSelectorFromString(selName) forControlEvents:UIControlEventTouchUpInside];
}
sels = [button actionsForTarget:targetVC forControlEvent:UIControlEventTouchUpInside];
NSLog(@"sels %@", sels);
// buttonに新しいメソッドを追加する
[button addTarget:targetVC action:@selector(newAction) forControlEvents:UIControlEventTouchUpInside];
sels = [button actionsForTarget:targetVC forControlEvent:UIControlEventTouchUpInside];
NSLog(@"sels %@", sels);