Несколько UIButtons 1 функция

В основном мне нужно иметь несколько кнопок в представлении. Я бы хотел, чтобы все они вызывали одну функцию, чтобы я мог отслеживать «состояние».

Как узнать, какая кнопка вызвала функцию? Есть ли способ получить текст отправителя?


person Critter    schedule 23.02.2011    source источник


Ответы (3)


В iOS методы действия, включая методы IBAction, могут иметь любую из следующих подписей (см. «Target-Action в UIKit"):

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

Если вы используете сигнатуру метода, которая принимает отправителя, у вас есть доступ к объекту, вызвавшему действие. Затем вы можете получить доступ к свойствам вызывающего объекта, включая его заголовок и тег. Вы также можете сравнить отправителя с уже имеющимися у вас указателями на кнопки, чтобы определить, какая кнопка является отправителем данного конкретного события.

Я предпочитаю сравнивать указатели, потому что считаю, что if (sender == self.nextPageButton) легче понять и с меньшей вероятностью сломать, чем if (sender.tag == 4) или if ([((UIButton *)sender).currentTitle isEqualToString:@"foo"]). Взгляд на теги в IB ничего не говорит вам о том, что код предполагает, что они означают, и являются ли они важными или нет. Заголовки будут меняться по мере обновления пользовательского интерфейса или локализации приложения, и эти изменения также не должны требовать изменения кода.

person Jonah    schedule 23.02.2011

Установите атрибут tag кнопки.

Вы можете сделать это в Interface Builder (просто просмотрите поля).

Затем в коде:

if (sender.tag == 0) {
} else if (sender.tag == 1)

и т.п.

person MarkPowell    schedule 23.02.2011

Вам не нужно устанавливать тег явно. Вы можете определить IBOutlets UIButton в вашем файле .h и их свойство, а также

@property (nonatomic , retain) IBOutlet UIButton *myButton;

и метод как

-(IBAction) browse : (id) sender; 

в файле .m вы можете реализовать метод как

-(IBAction) browse : (id) sender{

    if((UIButton *)sender == myButton){/*add the action here*/}
 } 

Добавьте больше операторов if в метод для любого количества кнопок. Подключите IBOutlets всех соответствующих кнопок, а также селектор просмотра.

Не забудьте освободить IBOutlets в методе Dealloc, чтобы предотвратить утечку памяти.

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

person devsri    schedule 24.02.2011