我设置了一个简单的事件处理程序,如此处所述,但似乎没有调用选择器。我将代码放在我的 AppDelegate 类中,并将委托连接到 IB 中。尝试在我希望被调用的选择器中放入一些 NSLog() 和断点,但没有一个被命中。URL 方案在启动我的应用程序时起作用,但在那之后它什么也不做。谁能建议如何解决这个问题?谢谢!
4 回答
好吧,我不禁注意到你的-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 类中,并让它打印出我在 Safari 中键入的 URL(使用自定义方案)。我会在该 -init 方法上放置一个断点并逐步执行它以绝对确保 -setEventHandler: 方法被调用。
最大的问题是:你在哪里调用 NSAppleEventManager 的 -setEventHandler:...?如果您想捕获启动应用程序的 URL,您需要在应用程序完成启动之前调用它。如果您的应用程序委托是在您的 MainMenu.nib 中创建的,那么它的 -init 或 -awakeFromNib 方法将起作用,但例如 -applicationDidFinishLaunching: 将不起作用。
此外,确保您提供给 -setEventHandler: 的选择器与您的方法名称完全相同,特别注意大写和正确的冒号数量。
显然,如果您发布了您的应用程序委托的相关代码,那将非常有帮助。
感谢您的建议。我仔细检查了那些东西。我确定这是一些新手错误,但我会感谢任何查看代码的人。(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
}
新手错误 #2:没有在 IB 中设置我的应用程序委托的类。修复这个和上面的 init 方法让我开始了。呃……