Как я могу устранить неполадки в моей пользовательской схеме URL? - PullRequest
1 голос
/ 03 декабря 2008

Я установил простой обработчик событий, как упомянуто здесь , но похоже, что селектор не вызывается. Я поместил код в свой класс AppDelegate и подключил делегата в IB. Попытка установки некоторых NSLog () и точек останова в селекторе, который я ожидаю вызвать, но ни один из них не был достигнут. Схема URL работает, поскольку она запускает мое приложение, но после этого ничего не делает. Кто-нибудь может посоветовать, как решить эту проблему? Спасибо!

Ответы [ 4 ]

2 голосов
/ 04 декабря 2008

Ну, я не могу не заметить, что вы -init метод объявлен неправильно. Если должно иметь тип возврата id и иметь return self; в конце.

- (id)init
{
    self = [super init];
    if (self) {
        [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getUrl:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
    }
    return self;
}

Благодаря этим исправлениям я смог вставить эти две подпрограммы в тестовый класс AppController и распечатать URL-адреса (с пользовательской схемой), которые я набрал в Safari. Я бы поставил точку останова на этот метод -init и прошел бы через него, чтобы быть абсолютно уверенным, что -setEventHandler: method вызывается.

0 голосов
/ 04 декабря 2008

Ошибка новичка # 2: Не установлен класс делегата моего приложения в IB. Исправление и метод init, как описано выше, помогли мне. Хмм ...

0 голосов
/ 04 декабря 2008

Спасибо за предложения. Я дважды проверил эти вещи. Я уверен, что это какая-то ошибка новичка, но я был бы признателен всем, кто смотрит на код. (Биты URL хранятся в info.plist.) Сейчас я просто пытаюсь подтвердить, что он работает, прежде чем что-то делать с URL.

- (void)init{
    self = [super init];
    if(self){
        [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getUrl:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
    }
}

- (void)getUrl:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{    
    NSString *url = [[event paramDescriptorForKeyword:keyDirectObject] stringValue];
    NSLog(url);
    // now you can create an NSURL and grab the necessary parts
}
0 голосов
/ 04 декабря 2008

Большой вопрос: где вы вызываете NSAppleEventManager's -setEventHandler: ...? Вам нужно позвонить до того, как ваше приложение завершит запуск, если вы хотите поймать URL, который запустил ваше приложение. Если ваш делегат приложения создается в вашем MainMenu.nib, то будут работать его методы -init или -awakeFromNib, но, например, -applicationDidFinishLaunching: не будет.

Также убедитесь, что селектор, который вы предоставляете для -setEventHandler: точно такой же, как имя вашего метода, уделяя особое внимание использованию заглавных букв и правильному количеству двоеточий.

Очевидно, что если вы разместите соответствующий код делегата приложения, это будет весьма полезно.

...