IOS: один IBAction для нескольких кнопок
В моем проекте я должен контролировать действие 40 кнопок, но я не хочу создавать 40 IBAction, могу ли я использовать только IBAction, как?
7 ответов
Если вы используете конструктор интерфейса для создания кнопок, просто наведите их на тот же IBAction в соответствующем классе.
Затем вы можете различить кнопки внутри метода IBAction, либо прочитав текст с кнопки...
- (IBAction)buttonClicked:(id)sender {
NSLog(@"Button pressed: %@", [sender currentTitle]);
}
... или установив tag
свойство в Xcode и чтение его обратно через [sender tag]
, (Если вы используете этот подход, начните теги с 1, так как 0 по умолчанию и, следовательно, малопригодны.)
-(IBAction)myButtonAction:(id)sender {
if ([sender tag] == 0) {
// do something here
}
if ([sender tag] == 1) {
// Do something here
}
}
// in Other words
-(IBAction)myButtonAction:(id)sender {
switch ([sender tag]) {
case 0:
// Do something here
break;
case 1:
// Do something here
break;
default:
NSLog(@"Default Message here");
break;
}
Установите все кнопки, чтобы использовать это одно действие. Действия обычно имеют sender
параметр, который вы можете использовать, чтобы выяснить, какая кнопка вызывает действие. Один из популярных способов определить разницу между кнопками - назначить разные значения каждой кнопке. tag
имущество. Таким образом, у вас может быть 40 кнопок с тегами в диапазоне от 1 до 40. (0, вероятно, не лучший выбор для тега, поскольку это значение по умолчанию, и любая кнопка, для которой вы забыли установить тег, будет иметь 0 в качестве значение тега.)
Этот метод наиболее полезен, когда все кнопки примерно одинаковы, например кнопки на калькуляторе или клавиатуре. Если каждая из кнопок делает что-то совершенно другое, то вы все равно получаете эквивалент 40 методов, но вы заменяете свой собственный оператор switch для системы обмена сообщениями Objective-C. В этом случае часто лучше просто потратить время на создание столько действий, сколько вам нужно, чтобы назначить их соответствующим образом.
Конечно. Просто подключите все кнопки к одному и тому же методу действия в Интерфейсном Разработчике. Используйте метод sender
аргумент (возможно, в сочетании с кнопками tag
свойство), чтобы определить, какая кнопка отправляет событие.
Просто используйте один IBAction и назначьте его всем вашим кнопкам.
Я сам использовал вышеописанный метод, имел набор кнопок, но преобразовал их все и вместо этого использовал переключатель
-(IBAction)buttons:(id)sender
{
switch ([sender tag])
{
case 0 :
}
}
Похоже, вы получаете все ответы, которые вам нужны, но я хотел добавить к ответам всех остальных.
Хотите ли вы использовать один IBAction или 40 действий, зависит от того, что вы хотите, чтобы кнопки делали. Если все кнопки выполняют совершенно разные функции, вам нужны все отдельные действия IBAction, но если вы хотите, чтобы все они выполняли одно и то же, вы можете использовать только одну. Мне нужно больше подробностей об этих кнопках и действиях, но у вас, вероятно, есть заголовок для каждой кнопки, так что вы можете использовать это, чтобы выделить каждую кнопку и создать сообщение или что-то, что настраивается с помощью конкретной нажатой кнопки. Вот пример. Каждый раз, когда нажимается кнопка, на этикетке отображается сообщение с надписью "нажатие кнопки".
Делая это таким образом, вам не нужно переключать регистр со всеми 40 шаблонами. Вы по-прежнему можете отображать или делать что-то, что индивидуализировано, с помощью кнопки, нажатой всего 2-3 строки кода.
- (IBAction)button_Clicked:(UIButton *)sender {
//Get the buttons' titles.
NSString *title =[sender titleForState:UIControlStateNormal];
//Construct a message that includes the *title.
NSString *plainText=[NSString stringWithFormat:@"%@ button pressed.", title];
//Assigns the *plainText to the label.
self.Label.text=plainText;
}
@end