#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. В вашем случае это параметр с префиксом подчеркивания.