Установить делегата для экземпляра моего класса?
У меня есть набор файлов C++ / obj c для создания своего рода оболочки C++ для Growl (то есть Obj C), но я застрял на одной части. Мне нужно установить Growl Delegate на что-то внутри моего класса Obj C, чтобы регистрация вызывалась.
Это мой.мм
#import "growlwrapper.h"
@implementation GrowlWrapper
- (NSDictionary *) registrationDictionaryForGrowl {
return [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObject:@"Upload"], GROWL_NOTIFICATIONS_ALL,
[NSArray arrayWithObject:@"Upload"], GROWL_NOTIFICATIONS_DEFAULT
, nil];
}
@end
void showGrowlMessage(std::string title, std::string desc) {
std::cout << "[Growl] showGrowlMessage() called." << std::endl;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[GrowlApplicationBridge setGrowlDelegate: @""];
[GrowlApplicationBridge
notifyWithTitle: [NSString stringWithUTF8String:title.c_str()]
description: [NSString stringWithUTF8String:desc.c_str()]
notificationName: @"Upload"
iconData: nil
priority: 0
isSticky: YES
clickContext: nil
];
[pool drain];
}
int main() {
showGrowlMessage("Hello World!", "This is a test of the growl system");
return 0;
}
и мой.h
#ifndef growlwrapper_h
#define growlwrapper_h
#include <string>
#include <iostream>
#include <Cocoa/Cocoa.h>
#include <Growl/Growl.h>
using namespace std;
void showGrowlMessage(std::string title, std::string desc);
int main();
#endif
@interface GrowlWrapper : NSObject <GrowlApplicationBridgeDelegate>
@end
теперь, как вы можете видеть мой [GrowlApplicationBridge setGrowlDelegate: @""];
устанавливается на пустую строку, мне нужно установить его на что-то, чтобы registrationDictionaryForGrowl
вызывается, что в данный момент не вызывается.
Но я не могу понять, как это сделать. Любая помощь?
1 ответ
Вам нужно создать экземпляр GrowlWrapper
и передать это как делегат setGrowlDelegate:
метод. Вы хотите сделать это только один раз в своем приложении, поэтому устанавливайте его каждый раз, когда вы звоните showGrowlMessage
не идеально. Вы также хотите сохранить сильную ссылку на это GrowlWrapper
так что вы можете отпустить его, когда закончите с ним, или так, чтобы он оставался действительным, если вы используете ARC. Таким образом, концептуально вы захотите что-то вроде следующего при запуске:
growlWrapper = [[GrowlWrapper alloc] init];
[GrowlApplicationBridge setGrowlDelegate:growlWrapper];
И при выключении:
[GrowlApplicationBridge setGrowlDelegate:nil];
[growlWrapper release]; // If not using ARC