Лучший способ определить отправителя события

У меня есть простой вопрос об обработке событий в приложениях iOS... предположим, у вас есть приложение с некоторыми кнопками, которые реагируют на событие TouchUpInside, вызывающее одно и то же действие, как лучше всего в методе действия понять, какая кнопка сработала? событие? Я знаю, что это можно легко сделать с помощью заголовка кнопки, но я думаю, что это не лучший способ, если у вас есть локализованное приложение, в котором текст кнопки может измениться (если только нельзя изменить локализацию заголовка, т.е. получить исходную строку из локализованной строки)... есть ли хорошая практика по этой теме? Должен ли я использовать какое-то другое свойство кнопок, чтобы различать разные кнопки?

Спасибо заранее за любую помощь.


person Gianni Costanzi    schedule 15.10.2011    source источник
comment
Тег отправителя — это ваш ответ. Проверьте ответ на этот SO. stackoverflow.com/questions/5542327/   -  person user523234    schedule 15.10.2011


Ответы (2)


Существует что-то, называемое «тегом», которое вы можете установить для UIButtons, или что-то, что может реагировать на событие в этом отношении. Если вы используете Interface Builder, щелкните инспектор атрибутов для элемента и выберите значение для тега (целое число). В вашем коде сделайте что-то вроде этого...

...

- (IBAction)buttonReceived:(id)sender
{ 
    if ([sender tag] == 1) {
       //Do something
    }
    else if ([sender tag] == 2) {
       //Do something else
    }
}
person Eric    schedule 15.10.2011
comment
Я мог бы создать перечисление, например enum { BUTTON_1, BUTTON_2, etc }, а затем использовать BUTTON_1 и BUTTON_2 в коде... есть ли способ использовать такие значения в поле тега в построителе интерфейсов или он принимает только числовые значения? У меня нет XCode под руками, поэтому сейчас не могу попробовать.. Спасибо за ответ. - person Gianni Costanzi; 16.10.2011
comment
Он принимает только числовые значения в построителе интерфейса, но вы наверняка можете сделать перечисление в своем коде, чтобы получить к ним доступ... просто чтобы код был более читаемым.. также спасибо за принятие моего ответа, поставив мне более 50 баллов, чтобы я мог теперь комментарий ха-ха - person Eric; 16.10.2011

В дополнение к свойству тега или просто в том случае, если вы уже используете тег для какой-либо другой цели, которая будет означать дублирование значений тега для одной или нескольких разных кнопок, вы всегда можете настроить ivar IBOutlet для каждой кнопки, которую вам нужно проверить, а затем в IBAction сделайте что-то вроде этого:

- (IBAction)buttonReceived:(UIButton *)sender
{ 
    if (sender == myButtonA) {
       // processing for button A
    }
    else if (sender == myButtonB) {
       // processing for button B
    }
}

Это немного больше работы, но иногда это может пригодиться.

person BP.    schedule 15.10.2011
comment
Это работает, если я создаю кнопки программно, а не через Interface Builder, верно? Можно/целесообразнее создать ивар IBOutlet и подключить его к кнопке create через конструктор интерфейсов? Кстати, я думаю, что метод тегов наиболее часто используется, верно? - person Gianni Costanzi; 16.10.2011
comment
Да, тег — это обычно то, что я делаю в большинстве случаев. Однако у меня была ситуация, когда свойство тега использовалось для отслеживания чего-то еще в одном из моих приложений, поэтому мне пришлось вернуться к этому методу. При этом я обычно создаю кнопку в Interface Builder и подключаю ее к IBOutlet, но вы также можете сделать это с программно созданными кнопками. Просто не забудьте сохранить ссылки на ваши кнопки, или, другими словами, не отпускайте кнопку сразу после того, как вы добавите ее в качестве подпредставления в текущем представлении. - person BP.; 17.10.2011
comment
Я не подумал о том, чтобы связать IBOutlet с кнопкой, что очень просто сделать :) Спасибо за подсказку! - person Gianni Costanzi; 18.10.2011