Подтвердить что ты не робот

IOS: один IBAction для нескольких кнопок

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

-(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;
}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

-(IBAction)buttons:(id)sender
{

    switch ([sender tag])

    {

        case 0 :

    }
}

Ответ 7

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

Если вы хотите использовать одно IBAction или 40 действий, вы можете использовать кнопки. Если все кнопки выполняют совершенно разные вещи, вам нужны все отдельные IBActions, но если вы хотите, чтобы все они делали то же самое, вы можете использовать только один. Мне нужно больше информации об этих кнопках и действиях, но у вас, вероятно, есть заголовок для каждой кнопки, поэтому вы можете использовать это, чтобы различать каждую кнопку и создавать сообщение или что-то, что настраивается нажатием конкретной кнопки. Вот пример. Каждый раз, когда нажимается кнопка, на этикетке отображается сообщение с надписью "i.e.title of the button".

Делая это таким образом, вам не нужно делать случай переключения со всеми 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