Отправить Действие Cocoa-IBAction

Я хотел бы отправить действие другому объекту с помощью cocoa. В идеале я также хотел бы, чтобы он появился в Interface builder.

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

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

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


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

5 ответов


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

[controller2 sendAction:@selector(receiveAction:) to:controller1];

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];

если вы хотите, чтобы ваш класс подключил селектор с помощью перетаскивания в Interface Builder, самый простой способ-сделать ваш класс подклассом NSControl (перетащите пользовательский вид из библиотеки объектов, команда-6, чтобы показать инспектор, выберите свой класс в верхнем всплывающем окне). Затем вы можете "вызвать" действие по:

- (void) go {
    [self sendAction:self.action to:self.target];
}

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

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


вы должны быть в состоянии сделать это, если ваш Controller2 class является подклассом NSControl. NSControl определяет "отправленное действие", которое вы подключаете к целевому объекту при перетаскивании из NSButton В Построителе интерфейса. Что, как говорится, есть (было?) ошибка В IB 3.0, которая помешала отправленному действию появиться в IB. См.Это какао-dev нить для сведения.


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