IOS: один IBAction для нескольких кнопок - PullRequest
36 голосов
/ 02 мая 2011

В моем проекте я должен контролировать действие 40 кнопок, но я не хочу создавать 40 IBAction, могу ли я использовать только IBAction, как?

Ответы [ 7 ]

56 голосов
/ 02 мая 2011

Если вы используете конструктор интерфейса для создания кнопок, просто наведите их на один и тот же IBAction в соответствующем классе.

Затем можно различить кнопки в методе IBAction, прочитав текст изкнопка ...

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"Button pressed: %@", [sender currentTitle]);    
}

... или путем установки свойства tag в Xcode и чтения его обратно через [sender tag].(Если вы используете этот подход, начните теги с 1, так как 0 по умолчанию и, следовательно, малопригодны.)

12 голосов
/ 26 декабря 2012
-(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;
}
9 голосов
/ 02 мая 2011

Установите все кнопки, чтобы использовать это одно действие.Действия обычно имеют параметр sender, который можно использовать, чтобы выяснить, какая кнопка вызывает действие.Один из популярных способов определить разницу между кнопками - назначить различное значение для свойства tag каждой кнопки.Таким образом, у вас может быть 40 кнопок с тегами в диапазоне от 1 до 40. (0, вероятно, не является хорошим выбором для тега, поскольку это значение по умолчанию, и любая кнопка, для которой вы забыли установить тег, будет иметь значение 0 в качествезначение тега.)

Этот метод наиболее полезен, когда все кнопки примерно одинаковы, например кнопки на калькуляторе или клавиатуре.Если каждая из кнопок делает что-то совершенно другое, то вы все равно получаете эквивалент 40 методов, но вы заменяете свой собственный оператор switch для системы обмена сообщениями Objective-C.В этом случае зачастую лучше просто потратить время на создание столько действий, сколько вам нужно, чтобы назначить их соответствующим образом.

4 голосов
/ 02 мая 2011

Конечно.Просто подключите все кнопки к одному и тому же методу действия в Интерфейсном Разработчике.Используйте аргумент sender метода (возможно, в сочетании со свойством кнопок tag), чтобы определить, какая кнопка отправляет событие.

0 голосов
/ 13 августа 2013

Похоже, вы получаете все ответы, которые вам нужны, но я хотел добавить к ответам всех остальных.

Хотите ли вы использовать один 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
0 голосов
/ 15 апреля 2013

Просто сам использовал вышеописанный метод, имел набор кнопок, но преобразовал их все и вместо этого использовал случай переключателя

-(IBAction)buttons:(id)sender
{

    switch ([sender tag])

    {

        case 0 :

    }
}
0 голосов
/ 02 мая 2011

Просто используйте один IBAction и назначьте его всем вашим кнопкам.

...