Отправьте какао действия - IBAction

Я обновил тензор потока, и он решил эту проблему

7
задан Ben Reeves 7 May 2009 в 11:07
поделиться

5 ответов

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

[controller2 sendAction:@selector(receiveAction:) to:controller1];
1
ответ дан 6 December 2019 в 08:45
поделиться

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

1
ответ дан 6 December 2019 в 08:45
поделиться

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

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

1
ответ дан 6 December 2019 в 08:45
поделиться

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

0
ответ дан 6 December 2019 в 08:45
поделиться

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];
}
18
ответ дан 6 December 2019 в 08:45
поделиться