2008-12-03 71 views
1

我设置了一个简单的事件处理程序,如here所述,但似乎没有调用选择器。我把代码放在我的AppDelegate类中,并用IB连接了代理。试图在选择器中放入一些NSLog()和断点,我希望被调用,但没有一个命中。 URL方案的工作原理是它启动我的应用程序,但在此之后它什么都不做。任何人都可以建议如何解决这个问题?谢谢!如何解决我的自定义URL方案?

回答

2

嗯,我不禁注意到你是-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浏览器的网址(定制方案)。我会在该-init方法上放置一个断点并逐步完成,以确保-setEventHandler:方法正在被调用。

+0

CRAP!我知道这将是一个新手的错误。谢谢... – jxpx777 2008-12-04 15:01:09

0

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

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

很明显,如果你发布了你的应用代理的相关代码,这将是非常有帮助的。

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 
} 
+0

我应该补充一点,我尝试将方法调用移动到-awakeFromNib但没有喜悦。 – jxpx777 2008-12-04 02:07:18

0

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

相关问题