Отправить Действие 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.