0

私のメイン アプリケーション ( MyApp) では、ウィンドウ コントローラー ( ) の新しいインスタンスを作成することにより、プログラムで他のウィンドウを作成しますMyWindowController。ウィンドウ コントローラが初期化されると、 を呼び出して nib ファイルからウィンドウと他のビュー/オブジェクトをロードします[self.window makeKeyWindow]awakeFromNibこれらのオブジェクトの 1 つのメソッド ( )MyModelには、(名前解決が原因で) 失敗する可能性のあるコードがいくつかあります。ユーザーにエラーを表示し、ウィンドウ コントローラー、ウィンドウ、およびすべての関連オブジェクトを破棄したいと考えています。 .

要約すれば:

  1. アプリケーションは の新しいインスタンスを作成しますMyWindowController
  2. MyWindowControllerを呼び出して、nib ファイルからウィンドウと他のビュー/オブジェクトをロードします[self.window makeKeyWindow]
  3. awakeFromNibこれらのオブジェクトの 1 つ ( のインスタンス)MyModelでエラーが発生しました (名前解決による)。
  4. ユーザーにエラー メッセージが表示され、MyWindowControllerMyModel、および関連する他のすべてのインスタンスが破棄されます。

最もココア風の方法でステップ 4 を達成するにはどうすればよいでしょうか?

明確にするために、を使用してユーザーにエラーを表示する方法を知っていますNSError。でエラーを処理するための推奨/正しい方法が、エラーawakeFromNibを表示して 内からすべてを解放することでawakeOnNibあるか、それともより良い方法があるか (アプリの再構築が必要になる場合があります) を調べようとしています。

4

1 に答える 1

2

エラーを表示するための最も残忍な Cocoa の方法は、 を使用すること-[NSResponder presentError:]です。

このメッセージの発行元のオブジェクトが から継承されているNSResponder場合は、次を使用できます。

[self presentError:someError];

そうでない場合は、これを使用できます。

[[NSApplication sharedApplication] presentError:someError];

または代わりに:

[NSApp presentError:someError];

-presentError:アプリケーション モーダル ダイアログの代わりに、ウィンドウ モーダル シートとしてエラーを表示できるバリエーションもあります。

NSErrorこれはすべて、何らかの方法でとして渡すインスタンスを取得したことを前提としていますsomeError。私はあなたのモデル オブジェクトに慣れていません。「失敗に遭遇した」と言うとき、それはモデルクラスの何らかのメソッドがこのエラーオブジェクトを提供することを意味しますか? または、モデル オブジェクトを引数として取る他のオブジェクトのメソッドでエラーが発生しますか? いずれの場合も、エラー オブジェクトを提供するメソッドは次のような形式に従う必要があります。

- (BOOL)myMethodReturningAnErrorByReference:(NSError **)error

また

- (id)myMethodReturningAnErrorByReference:(NSError **)error

前の例では、メソッドはYESまたはNOを返します。 の場合はNO、 のインスタンスをNSError参照によって返す必要があります。これを提示できます。後者の例では、メソッドはオブジェクトへの有効な参照を返すか、 を返しますnil。また、 の場合はnil、 のインスタンスをNSError参照によって返す必要があります。これを提示できます。

codeさらに、プロパティとプロパティを調べることで、条件付きでエラーを表示できdomainます。プレゼンテーションのコンテンツをカスタマイズできる継承クラスをオーバーライド-willPresentError:することもできます。NSResponder

最後に、 Apple のオンライン ドキュメントのこのページには、豊富な背景情報が記載されています。エラーの表示に使用されるエラー レスポンダー チェーンについては完全に説明しましたが、そこで説明しています。

あなたの努力に幸運を。

于 2013-09-11T00:42:09.243 に答える