Как добавить (id) отправителя к следующему - (IBAction)? - PullRequest
0 голосов
/ 12 января 2010

Как добавить отправителя (id) в следующий код?

- (IBAction) gobutton: (UIButton *) button5 {

Все, что я пробую, терпит неудачу, любая помощь будет оценена. Спасибо.

РЕДАКТИРОВАТЬ: мне нужно сохранить ссылку на кнопку (UIButton *) 5 в (IBAction)

Ответы [ 6 ]

5 голосов
/ 12 января 2010

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

- (IBAction) gobutton: (id) sender {
if(sender == button5)
   //do something...
else
   //do something else...
}

Предполагается, что вы указали button5 в качестве параметра, указывающего, что это выполняется в ответ на нажатие кнопки 5.

3 голосов
/ 12 января 2010

Хорошо, сначала .... IBAction не означает ничего особенного, кроме Интерфейсного Разработчика. В основном:

#define IBAction void

Поэтому всякий раз, когда вы видите IBAction, думайте «пустота». Единственная причина, по которой он существует, заключается в наличии флага, сообщающего Интерфейсному Разработчику, что метод является допустимым методом для подключения управляющих действий. Компилятору Objective-C не нужно знать об этом, поэтому он определен как void, поскольку все методы «action» возвращают void.

Во-вторых, методы действия также имеют один аргумент, который может быть объектом любого числа типов. Из-за этого методы действия должны использовать тип id в качестве типа своего аргумента. Таким образом, им можно передать указатель на любой объект Objective-C, не вызывая при этом компилятор сгенерировать ошибку проверки типа.

Так что обычно действия должны работать примерно так:

- (IBAction)myAction:(id)sender {
    if (sender == self.someButton) {
        UIButton *button = (UIButton *)sender;
        ...
        return;
    } else if (sender == self.someControl) {
        UIControl *control = (UIControl *)sender;
        ...
        return;
    }
}

Другими словами, id почти подобен нетипизированному указателю, как void * обычно используется в C, когда какой-то функции требуется взять указатель на что-то неизвестного типа. sender может быть различными типами управления, поэтому используется нечто общее, например id, тогда отправитель приводится к чему-то более конкретному, когда код знает, что это такое.

В любом случае, нет абсолютно никакой причины определять что-либо как возвращаемый тип IBAction, если только вы не собираетесь использовать этот метод в качестве целевого действия в Интерфейсном Разработчике. Наличие делегата IBAction в вашем приложении кажется необычным ...

2 голосов
/ 12 января 2010

Не ясно, что вы пытаетесь сделать, но большинство действий выглядит так:

- (IBAction) gobutton: (id)sender;
1 голос
/ 12 января 2010

Первый параметр для действия - это всегда отправитель (вы можете указать тип и имя в зависимости от ситуации).

Если метод является действием для кнопки, то первым параметром будет кнопка.Если этот метод является действием для нескольких кнопок, то первый параметр позволит вам определить, какая кнопка была нажата (как описывает Лепер).

Какую проблему вы на самом деле пытаетесь решить?
Существуют методы передачи информации в метод действия.Например, если у вас есть кнопка, которая появляется в ячейке табличного представления и выполняет одно и то же действие для каждой ячейки, то в методе действия вы захотите определить, какая кнопка ячейки была нажата.

0 голосов
/ 06 апреля 2010

Как я могу получить идентификатор отправителя, прежде чем пользователь коснется элемента управления?

Нашел это! Установите тег и используйте viewWithTag.

0 голосов
/ 12 января 2010

Можете ли вы создать простую структуру, которая содержит и UIButton, и отправителя, и использовать это?

struct myObject { UIButton * button5; идентификатор отправителя; }

... или вы можете создать свой собственный NSObject (возможно, больше какао-у):

@ instance myObject: NSObject { ... }

...