Мое действие делегата не вызывается в Cocoa

#objective-c #ios #cocoa-touch #macos #cocoa

#цель-c #iOS #прикосновение какао #macos #какао

Вопрос:

У меня есть класс, у которого есть свой делегат:

 @protocol SNIRCControllerDelegate

- (void) serverTalked:(id)data;

@end

@interface SNIRCController : NSObject <NSStreamDelegate> {
    id<SNIRCControllerDelegate> delegate;

}
- (void) setDelegate:(id<SNIRCControllerDelegate>)_delegate;
- (void) test;
@end
 

Реализация:

 @implementation SNIRCController

- (void) setDelegate:(id<SNIRCControllerDelegate>)_delegate {
    _delegate = delegate;
}
- (void) test {
    [delegate serverTalked:@"test"];

}
 

Но по какой-то причине [delegate serverTalked:@"test"]; не вызывает делегата :/
Вот как я делаю это в AppDelegate:

 @interface AppDelegate : NSObject <NSApplicationDelegate, NSStreamDelegate, SNIRCControllerDelegate> {

    IBOutlet NSTextView *logField;
    SNIRCController *ircController;
}

@property (assign) IBOutlet NSWindow *window;

-(void)writeToLog:(NSString*)data;

@end

@implementation AppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    ircController = [[SNIRCController alloc] init];
    [ircController setDelegate:self];

    [ircController test];
}
- (void) serverTalked:(id)data {
    NSLog(@"got called :D");
}

-(void)writeToLog:(NSString*)data {

    NSAttributedString *stringToAppend = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@n", data]];
    [[logField textStorage] appendAttributedString:stringToAppend];

}
 

Но serverTalked: не вызывается:( что я делаю не так?

Ответ №1:

В вашей реализации setDelegate: это:

 _delegate = delegate;
 

должно быть:

 delegate = _delegate;
 

Вы запутались и поменяли местами ivar и parameter. Путаница могла быть вызвана тем фактом, что префикс подчеркивания чаще используется для ivar. В вашем случае это параметр с префиксом подчеркивания.