UIControl — изменение назначенных селекторов: addTarget и removeTarget

Я использую 10 кнопок в своем интерфейсе, и мне нужно время от времени менять селектор кнопок.

Должен ли я использовать:

-(void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents 

прежде чем я изменю селектор, или я могу просто использовать:

-(void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents 

Я обеспокоен тем, что если я изменю селектор с помощью метода addTarget: без метода removeTarget:, я по существу «сложу» селекторы для моего UIButton, чтобы он срабатывал при нажатии.


person samfu_1    schedule 30.12.2009    source источник


Ответы (2)


Да, вы всегда должны удалять ранее добавленную цель, прежде чем назначать новую цель кнопке. Нравится---

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn setFrame:CGRectMake(50, 50, 200, 50)];

    [btn setTag:101];
    [btn addTarget:self action:@selector(method1) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];


    btn = (UIButton *)[self.view viewWithTag:101];
    [btn removeTarget:self action:@selector(method1) forControlEvents:UIControlEventTouchUpInside];
    [btn addTarget:self action:@selector(method2) forControlEvents:UIControlEventTouchUpInside];

теперь, если вы сделаете это

btn = (UIButton *)[self.view viewWithTag:101];
        [btn addTarget:self action:@selector(method2) forControlEvents:UIControlEventTouchUpInside];

то будут вызываться оба метода method1 и method2.

Надеюсь это поможет.

person Madhup Singh Yadav    schedule 30.12.2009
comment
Спасибо. Я заметил, что в документах Apple указано, что передача NULL для параметра action: удаляет все методы действия, связанные с target. Если приемник метода removeTarget: является UIButton, а цель является self (вызывается в viewController), удалит ли это все методы, привязанные к этому UIButton? Поскольку я назначаю только один метод для каждой кнопки, все, что мне нужно сделать, это передать NULL в параметре action: ... В этом случае, не аналогично ли это ссылке на точный метод, который нужно удалить, как вы сделали в своем пример выше? - person samfu_1; 31.12.2009

Да, вам нужно будет удалить старую цель/действие, иначе будут выполнены как старые, так и новые действия.

person gerry3    schedule 30.12.2009