Отправить действие какао - IBAction - PullRequest
7 голосов
/ 07 мая 2009

Я бы хотел отправить действие другому объекту, используя какао. В идеале мне бы хотелось, чтобы оно появилось в Интерфейсном конструкторе.

Я пробовал документацию на Apple, но кое-что мне не хватает. При добавлении следующего, построение интерфейса показывает действие только как полученное.

- (IBAction)setTarget:(id)anObject;
- (IBAction)setAction:(SEL)aSelector;

Может кто-нибудь дать мне пример того, как создать отправленное действие. Спасибо


У меня есть действие приема, определенное в моем контроллере1. Затем я хочу, чтобы мой controller2 мог отправлять действие на controller1 (как это делает NSButton). В построении интерфейса вы можете перетащить линию ОТ NSButton к элементу управления, который должен получить сигнал. Эта функциональность не может быть ограничена только яблочными объектами, должен быть способ сделать это.

Ответы [ 5 ]

18 голосов
/ 07 мая 2009

IBAction - это директива препроцессора, которая сообщает Interface Builder «это то, о чем вы должны знать». Это на самом деле оценивается в void. Это означает, что «действия» - это обычные методы, которые вы можете вызывать обычным способом:

[target someMethod:self];

Если вы хотите имитировать поведение, которое вы можете получить от NSButton, вы можете добавить выход для цели и свойство для селектора (в виде строки):

@property (nonatomic, retain) IBOutlet id target;
@property (nonatomic, retain) NSString* actionSelectorString;

Который вы могли бы затем назвать так:

SEL action = NSSelectorFromString(self.actionSelectorString);
[self.target performSelector:action withObject:self];

Если вы хотите, чтобы ваш класс подключал селектор с помощью перетаскивания в Интерфейсном Разработчике, самый простой способ - сделать ваш класс подклассом NSControl (перетащите пользовательский вид из библиотеки объектов, Command- 6, чтобы показать инспектора, выберите свой класс в верхнем всплывающем окне). Затем вы можете «вызвать» действие:

- (void) go {
    [self sendAction:self.action to:self.target];
}
1 голос
/ 07 мая 2009

controller1 и controller2 являются подклассами NSControl.

[controller2 sendAction:@selector(receiveAction:) to:controller1];
1 голос
/ 07 мая 2009

NSButton - это NSControl, поэтому у него есть «действие», которое вы можете подключить - сообщение, которое отправляется при запуске элемента управления (например, при нажатии на кнопку). У контроллера нет действия (что бы это значило - как бы вы вызвали отправку сообщения?), Поэтому то, что вы пытаетесь сделать, на самом деле не имеет смысла.

Если вы хотите, чтобы controller2 мог иметь что-то для controller1, вы должны создать розетку на controller2 (типа controller1 или какой-то другой интерфейс, который она реализует), подключить его к controller1 в IB, а затем вы можете отправить любое хочу от контроллера2 к контроллеру 1 программно.

1 голос
/ 07 мая 2009

Вы можете сделать это, если ваш класс Controller2 является подклассом NSControl. NSControl определяет «отправленное действие», которое вы подключаете к целевому объекту при перетаскивании из NSButton в Интерфейсном Разработчике. При этом в IB 3.0 есть (была?) Ошибка, из-за которой отправленное действие не отображалось в IB. См. эту тему какао-разработчика для деталей.

0 голосов
/ 07 мая 2009

Действия всегда принимаются объектом. Если вы хотите отправить информацию в другом направлении, возможно, вам нужен выход: ищите IBOutlet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...