1

我设置了一个简单的事件处理程序,如此处所述但似乎没有调用选择器。我将代码放在我的 AppDelegate 类中,并将委托连接到 IB 中。尝试在我希望被调用的选择器中放入一些 NSLog() 和断点,但没有一个被命中。URL 方案在启动我的应用程序时起作用,但在那之后它什么也不做。谁能建议如何解决这个问题?谢谢!

4

4 回答 4

2

好吧,我不禁注意到你的-init方法被错误地声明了。如果应该有返回类型idreturn self;在最后有一个。

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

通过这些修复,我能够将这两个例程粘贴到测试 AppController 类中,并让它打印出我在 Safari 中键入的 URL(使用自定义方案)。我会在该 -init 方法上放置一个断点并逐步执行它以绝对确保 -setEventHandler: 方法被调用。

于 2008-12-04T04:11:35.207 回答
0

最大的问题是:你在哪里调用 NSAppleEventManager 的 -setEventHandler:...?如果您想捕获启动应用程序的 URL,您需要在应用程序完成启动之前调用它。如果您的应用程序委托是在您的 MainMenu.nib 中创建的,那么它的 -init 或 -awakeFromNib 方法将起作用,但例如 -applicationDidFinishLaunching: 将不起作用。

此外,确保您提供给 -setEventHandler: 的选择器与您的方法名称完全相同,特别注意大写和正确的冒号数量。

显然,如果您发布了您的应用程序委托的相关代码,那将非常有帮助。

于 2008-12-03T22:16:23.317 回答
0

感谢您的建议。我仔细检查了那些东西。我确定这是一些新手错误,但我会感谢任何查看代码的人。(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
}
于 2008-12-04T02:05:36.460 回答
0

新手错误 #2:没有在 IB 中设置我的应用程序委托的类。修复这个和上面的 init 方法让我开始了。呃……

于 2008-12-04T15:12:14.250 回答