2015-02-09 2 views
1

Я использую две кнопки для выполнения того же действия. Как я могу определить, какая кнопка была нажата с помощью «отправителя» из моей функции IBAction? (Каждая кнопка имеет другую метку)Как использовать атрибуты отправителя в Objective-C

Вот что я хочу сделать:

- (IBAction)addItemInParent:(id)sender { 
    NSInteger choice = sender.tag; 
} 

Я надеюсь, что этот вопрос имеет смысл!

+0

У вас есть несколько ответов, все из которых хороши. Примите тот, который работал на вас (тот, который вы использовали). – CaptJak

ответ

2
- (IBAction)addItemInParent:(id)sender 
{ 
    UIButton *buttonPressed = (UIButton *)sender; 

    if (buttonPressed.tag == 123) 
    { 
     //button with tag 123 was pressed 
    }else if (buttonPressed.tag == 124 
    { 
     //button with tag 124 was pressed 
    } 
} 

Просто замените мои 123 и 124 тем, что на самом деле являются тегами кнопок.

1

После заброса отправителя UIButton, пытались ли вы:

if (choice == 101) 
{ 
    // button whatever was pressed 
} 
else 
{ 
    // the other button was pressed 
} 

Очевидно, что вы должны использовать тег, назначенные кнопки.

+0

'(id) отправитель' не имеет свойства 'tag'. – CaptJak

+0

@CaptJak Его бросают в UIButton. Прочтите, пожалуйста, перед тем, как спуститься. – joakim

+0

Я не вижу его как литого как UIButton, ни на вашем посту, ни на OP. И хотя я хочу, чтобы все поданные голоса сопровождались комментарием, похоже, что ваш был не с тех пор, как я не являюсь нищим. – CaptJak

0

Вы должны 1) проверить, если идентификатор объекта является фактически UIView класса или подкласса
2) типаж объект идентификатор UIView 3) проверить тег 4) решить, что дальше на основе тега

Необходимо указать тип, потому что идентификатор может быть объектом любого типа, и вы должны убедиться, что на самом деле это экземпляр класса или подкласса UIView, чтобы иметь доступ к тегу, поскольку только классы и подклассы UIView имеют тег имущество.

+0

OP говорит, что у него две кнопки, поэтому приведение и проверка подкласса UIView не требуется ... Если посмотреть на существующий код, я бы предположил, что был создан 'IBAction', связанный с объектом' UIButton' из Раскадровка. – CaptJak

+0

Само действие относится к контроллеру вида. Это некоторая логика в слое контроллера. Apple, выбрав «id», имеет очень большой смысл. Уровень контроллера никогда не должен зависеть от уровня представления. Наличие в качестве идентификатора означает, что при изменении слоя презентации (замените кнопки чем-то другим) он не нарушит действие в контроллере. Однако ясно, что что-либо на экране будет своего рода классом UIView. Вот почему кастинг на самый высокий суперкласс. –

+0

Верно, и я не говорю, что вы ошибаетесь. Ваше решение будет продолжать работать даже в случае, если UIButton будет изменен на что-либо еще (в некоторых из моих собственных случаев у меня это, как описано выше).Строго говоря о OP, однако, он действительно говорит UIButton ... – CaptJak

1

Изменить идентификатор для UIButton так:

- (IBAction)addItemInParent:(UIButton *)sender { 
    NSInteger choice = sender.tag; 
} 
1

Если вы уверены в том, что этот метод вызывается только с помощью нажатия кнопки, то вы можете переписать свой метод к этому:

- (IBAction)addItemInParent:(UIButton *)sender { 
    NSInteger choice = sender.tag; 
} 

Если нет, проверьте класс отправителя:

- (IBAction)addItemInParent:(id)sender { 
    if ([sender isKindOfClass:[UIButton class]]) { 
    UIButton *button = (UIButton *)sender; 
    NSInteger choice = button.tag; 
    } 
    else { 
    // handle other cases 
    }  
} 
+0

Отлично, это то, что я искал спасибо! –

Смежные вопросы