LoginSignup
7
7

More than 5 years have passed since last update.

UIControl 割り当てられたメソッドを削除して入れ替える

Posted at

UIButtonなどのUIControlクラス(or継承)で、割り当てられているメソッドを削除して新しいメソッドを割り当てる方法です。

例えば、Appleが実装し用意しているViewControllerとそれに追加されてUIButtonがあるとします。
このUIButtonが呼び出している何だかわからないメソッドを削除し任意のメソッドを呼び出すようにしたくてやりました。

サンプルコード

仮でUIViewController *targetVCUIButton *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);
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7