hereに記載されているように単純なイベント ハンドラーを設定しましたが、セレクターが呼び出されていないようです。コードを AppDelegate クラスに入れ、デリゲートを IB に接続しました。呼び出されると予想されるセレクターに NSLog() とブレークポイントをいくつか入れようとしましたが、どれもヒットしません。URL スキームは、アプリを起動する限りは機能しますが、その後は何もしません。誰でもこれをトラブルシューティングする方法をアドバイスできますか? ありがとう!
4 に答える
さて、あなた-init
のメソッドが誤って宣言されていることに気付かずにはいられません。If には戻り型id
がありreturn self;
、最後に a が必要です。
- (id)init
{
self = [super init];
if (self) {
[[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(getUrl:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
}
return self;
}
これらの修正により、これら 2 つのルーチンをテスト用の 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 メソッドを修正することで、うまくいきました。うーん...