controller1 и controller2 являются подклассами NSControl.
[controller2 sendAction:@selector(receiveAction:) to:controller1];
Вы сможете сделать это, если ваш класс Controller2
является подклассом NSControl
. NSControl
определяет «отправленное действие», которое является тем, что вы подключаете к целевому объекту при перетаскивании из NSButton
в Интерфейсном Разработчике. При этом в IB 3.0 есть (была?) Ошибка, из-за которой отправленное действие не отображалось в IB. Подробности см. В этой теме по какао-разработчикам .
NSButton - это NSControl, поэтому у него есть «действие», которое вы можете подключить - сообщение, которое отправляется когда вы запускаете элемент управления (например, нажимая на кнопку). Контроллер не имеет действия (что бы это значило - как бы вы вызвали отправку сообщения?), Поэтому то, что вы пытаетесь сделать, на самом деле не имеет смысла.
Если вы хотите, чтобы controller2 был Чтобы контроллер1 мог что-то сделать, вы должны создать розетку на контроллере 2 (типа controller1 или какого-либо другого интерфейса, который он реализует), подключить его к controller1 в IB, и затем вы можете программно отправлять любое сообщение из контроллера2 на контроллер 1.
Действия всегда принимаются объектом. Если вы хотите отправить информацию в другом направлении, возможно, вам нужен выход: ищите IBOutlet.
IBAction
is a preprocessor directive that tells Interface Builder "this is something you should know about." It actually evaluates to void
. What that means is that the "actions" are just normal methods that you can call in the normal way:
[target someMethod:self];
If you want to mimic the behavior you can get from an NSButton
, you can add an outlet for the target and a property for the selector (as a string):
@property (nonatomic, retain) IBOutlet id target;
@property (nonatomic, retain) NSString* actionSelectorString;
Which you could then call like this:
SEL action = NSSelectorFromString(self.actionSelectorString);
[self.target performSelector:action withObject:self];
If you want your class to wire up the selector via drag-and-drop in Interface Builder, the easiest way is to make your class a subclass of NSControl
(drag a custom view in from the object library, Command-6 to show inspector, choose your class in the top popup). You can then "call" the action by:
- (void) go {
[self sendAction:self.action to:self.target];
}