0

したがって、try/catch ブロックが発生した後にモーダル ウィンドウを表示して、ユーザーが特定の選択を行えるようにするプログラムがあり、プログラムを続行したいと考えています。これを機能させる方法がわかりません。これらの例外が引き続き発生します。

*** Assertion failure in -[NSApplication _commonBeginModalSessionForWindow:relativeToWindow:modalDelegate:didEndSelector:contextInfo:], /SourceCache/AppKit/AppKit-1187.34/AppKit.subproj/NSApplication.m:3920

Exception detected while handling key input.

Modal session requires modal window

モーダル シートを 2 つの異なる方法で表示するように構成しました。最初の方法はボタンを押す方法で、2 番目の方法は try catch ブロックの後です。直接リンクされているボタンを押して表示するとConfigure Game正常に動作しますが、別のメソッドで try catch ブロックを介して表示すると、上記のすべての例外がスローされます。

//Method that opens the modal sheet
- (IBAction)configureGame:(id)sender
{
    //Calls a webview for the user to go to a specific location   
    NSString *FGstarter = @"http://www.google.com";
    NSURL *FGplayerUrl = [NSURL URLWithString:FGstarter];        
    [webView setMainFrameURL:[FGplayerUrl absoluteString]];

    //Opens the Modal Sheet
    [NSApp beginSheet:configureSheet modalForWindow:mainWindow
        modalDelegate:self didEndSelector:NULL contextInfo:nil];

}

//Select Method to a Select button which also closes the Sheet
- (IBAction)select:(id)sender{
    //sets a NSString Instance Var to the Current URL of the webView
    currentPage = [webView stringByEvaluatingJavaScriptFromString:@"window.location.href"]);

    //Closes the sheet
    [NSApp endSheet:configureSheet];     
}


-(NSMutableArray *)loadPlayer:(NSString *)name{
@try {
   // Code here might cause exception that gets caught in the catch
}
@catch (NSException *exception) {
    //When I call this function I get all the exceptions listed in the top of the post
    [self configureGame:nil];
    //Ideally here what would happen here is the modal sheet would pop up the user would hit the select button that calls the select method then the program continues running.  
}
   NSString *page = currentPage;
   //...Continue Using this method
}
4

1 に答える 1

1

これをしないでください。Apple ドキュメントから...

重要多くの環境では、例外の使用はかなり一般的です。たとえば、例外をスローして、ファイルが見つからない場合やデータを正しく解析できなかった場合など、ルーチンが正常に実行されなかったことを知らせることができます。Objective-C では、例外はリソースを大量に消費します。一般的なフロー制御、または単にエラーを示すために例外を使用しないでください。代わりに、メソッドまたは関数の戻り値を使用してエラーが発生したことを示し、エラー オブジェクトで問題に関する情報を提供する必要があります。詳細については、「エラー処理プログラミング ガイド」を参照してください。

この質問に対するトップの回答も参照してください

于 2013-01-12T22:18:18.600 に答える