【发布时间】:2008-12-03 16:04:02
【问题描述】:
如here 所述,我设置了一个简单的事件处理程序,但似乎没有调用选择器。我将代码放在我的 AppDelegate 类中,并将委托连接到 IB 中。尝试在我希望被调用的选择器中放入一些 NSLog() 和断点,但没有一个被命中。 URL 方案在启动我的应用程序时起作用,但在那之后它什么也不做。谁能建议如何解决这个问题?谢谢!
【问题讨论】:
标签: objective-c cocoa appleevents
如here 所述,我设置了一个简单的事件处理程序,但似乎没有调用选择器。我将代码放在我的 AppDelegate 类中,并将委托连接到 IB 中。尝试在我希望被调用的选择器中放入一些 NSLog() 和断点,但没有一个被命中。 URL 方案在启动我的应用程序时起作用,但在那之后它什么也不做。谁能建议如何解决这个问题?谢谢!
【问题讨论】:
标签: objective-c cocoa appleevents
好吧,我不禁注意到你的 -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 方法让我走了。呜呜呜……
【讨论】: