13

NSErrorUIAlertView、およびNSErrorRecoveryAttemptingiOS で一緒に使用する正しい方法の例を見つけるのに苦労しています。私が見つけることができるドキュメントと例のほとんどは、関連する動作が Cocoa によって統合されている OS X の同等の機能をカバーしています。しかし、iOS ではこれを「手作業で」行う必要があるようで、それがどのように行われたかの良い例を見つけることができません。

NSErrorsNSError の情報を使用して、ユーザーに報告された回復の試行をサポートするためのベスト プラクティスの例をいくつか示していただければ幸いです。

4

3 に答える 3

6

Appleのドキュメントによると:

重要: NSError クラスは、Mac OS X と iOS の両方で使用できます。ただし、エラー レスポンダとエラー リカバリの API とメカニズムは、アプリケーション キット (Mac OS X) でのみ使用できます。

NSErrorRecoveryAttemptingしたがって、ドキュメントで定義されているように見えても、使用できるかどうかはわかりません (これは、AppKit のドキュメントからコピーされた後、まだ更新されていない UIKit ドキュメントの領域のようです)。

コードでエラーを処理する方法は次のとおりです。

NSError *error = nil;
id result = [SomeClass doSomething:&error];

if (!result) {
    NSLog(@"Do something failed: %@", error);
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Something failed!" message:@"There was an error doing something." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
    [alert show];
    return;
}
于 2011-05-18T09:13:27.090 に答える
2

これの素晴らしい例を見つけました。

James Beith による次のブログ投稿と GitHub コード (サンプル プロジェクトを含む) を参照してください。

http://www.realmacsoftware.com/blog/cocoa-error-handling-and-recovery

https://github.com/realmacsoftware/RMErrorRecoveryAttempter

これをiPhoneシミュレーターで正常に使用できました。

于 2013-03-07T17:27:22.107 に答える
1

主に、レスポンダーチェーンを利用してエラーを上に転送したいため、UIKit で AppKit のエラー処理メカニズムをミラーリングしようとしています。これを完全にテストしたわけではありませんが、現時点では以下のようになっています。

これは AppKit をかなり厳密に反映していますが、will/did フックをオーバーライドして、それぞれカスタム エラー表示と回復を実行できます。デフォルトの動作は、プレゼンテーション用に UIAlertView を表示し、回復用に psuedo-NSErrorRecoveryAttempting オブジェクトを使用することです。

@implementation UIResponder (ErrorHandling)

- (void)presentError:(NSError *)error
        completion:(void (^)(BOOL recovered))completion
{
    if (nil == (error = [self willPresentError:error])) {
        return;
    }
    if (self.nextResponder) {
        [self.nextResponder presentError:error completion:completion];
        return;
    }

    // Code to create and show UIAlertView
    // e.g. https://github.com/jayway/CWUIKit/blob/master/Classes/UIAlertView%2BCWErrorHandler.m

    // The UIAlertViewDelegate calls didPresentError...
}

/*
 Override to customise the error object as in AppKit.
 You can also perform your own error presentation, and return nil to terminate the default handling.
 Custom error presentation UI should still call didPresentError... when dismissed
 */
- (NSError *)willPresentError:(NSError *)error
{
    return error;
}

/*
 Override to perform custom error recovery.
 */
- (void)didPresentError:(NSError *)error optionIndex:(NSInteger)optionIndex completion:(void (^)(BOOL recovered))completion
{
    id recoveryAttempter = [error recoveryAttempter];
    if ([recoveryAttempter respondsToSelector:@selector(attemptRecoveryFromError:optionIndex:completion:)]) {
        [recoveryAttempter attemptRecoveryFromError:error optionIndex:optionIndex completion:completion];
    }
}

@end
于 2012-10-26T08:13:53.090 に答える