Определение нажатой кнопки

Я хочу иметь возможность определять, какая кнопка нажата. Интересно, есть ли какой-нибудь метод класса UIButton, который может вызываться автоматически при нажатии кнопки, что позволяет мне узнать текст или тег нажатой кнопки и передать его переменной? Или какой-нибудь метод события objective-c, который делает то же самое?

Я знаю, что эта тема была размещена здесь раньше. Обычный ответ, кажется, таков:

В файле .h

- (IBAction)buttonClicked:(UIButton *)sender;

В файле .m

- (IBAction)buttonPressed:(UIButton *)sender{
// Do something her to display which button pressed
}

Я также видел другие примеры с такими именами, как buttonPressed, onButtonTao и т. Д.

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

В следующем примере, опубликованном здесь, в Stack, используется то же действие, но программно:

for( int i = 0; i < 5; i++ ) {
  UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  [aButton setTag:i];
  [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
  [aView addSubview:aButton];
}

// then ...

- (void)buttonClicked:(UIButton*)button
{
  NSLog(@"Button %ld clicked.", (long int)[button tag]);
}

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


person Mr Emkei    schedule 20.07.2013    source источник
comment
Каким образом Xcode жалуется?   -  person Wain    schedule 20.07.2013
comment
Определенно возможно подключение нескольких элементов управления к одному и тому же методу действия. Вам нужно уточнить проблему.   -  person jscs    schedule 20.07.2013


Ответы (2)


Вы можете подключить более одной кнопки к одному и тому же методу действия в Xcode. После создания и подключения первого действия перетащите оставшиеся кнопки, удерживая клавишу Control, к существующему действию в файле .h:

введите описание изображения здесь

Затем вы можете назначить различные теги кнопкам в инспекторе атрибутов и проверить [sender tag] в методе действия.

Если вы создаете новое действие с тем же именем, Xcode создает другой метод с тем же именем, что вызовет ошибки компилятора из-за «повторяющихся объявлений».

person Martin R    schedule 20.07.2013
comment
Я знал, что это настолько просто, что, когда я получу ответ, я, конечно, почувствую :-) Спасибо! - person Mr Emkei; 20.07.2013

Похоже, вы пытаетесь скопировать и вставить этот образец в свой код, но он не работает, верно? Вы должны предоставить кнопкам рамку.

Вот Рабочий код:

for( int i = 0; i < 5; i++ ) 
{
    UIButton* aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    aButton.frame = CGRectMake(10 + i*50,10,50,50);
    [aButton setTag:i];
    [aButton addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:aButton];
}

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

person Bhavin    schedule 20.07.2013