2011-05-11 3 views
12

私は、iOS上でNSErrorUIAlertView、およびNSErrorRecoveryAttempting一緒に使用するための正しい方法のトラブル見つけるの例を抱えています。私が見つけることができるドキュメンテーションとサンプルのほとんどは、関連する動作がCocoaによって統合されているOS Xの同等の機能をカバーしています。しかし、iOSでは、これを「手作業」で行う必要があると思われ、どのようにして良いのか分かりません。のiOSでNSErrorRecoveryAttempting、NSError、およびUIAlertViewの正しい使用は何ですか?

NSErrorの情報を使用してNSErrorsからユーザーに報告される復旧試行をサポートするためのベストプラクティスの例をありがとうと思います。 Appleのドキュメントによると

+0

ある時点で、私はUIAlertViewなどを使ってNSErrorを提示して処理するコードを書いていましたが、実際には 'recoveryAttempter'というエラーが発生しているので、本当に正しいかどうかわかりません。 – Anomie

答えて

6

重要:NSErrorクラスは、Mac OS XとiOSの両方で利用可能です。ただし、エラーレスポンダAPIおよびエラーリカバリAPIおよびメカニズムは、アプリケーションキット(Mac OS X)でのみ使用できます。文書で定義されているように見えるんが、あなたがNSErrorRecoveryAttemptingを使用することができるかどう

だから、私はわからないんだけど、これはまだコピーされた後に更新されていないのUIKitドキュメントの領域があるように(それが見えますAppKitのドキュメントから)。ここで

は、私は私のコードでエラーを処理する方法である:

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; 
} 
+2

NSErrorRecoveryAttemptingは非公式のプロトコルであるため、適合させる目的のために必要とされる全ては、これら2つのメソッドを実装することです。 iOS上のNSErrorには、必要なプロパティと定数が含まれています。 Appleのコメントは明らかに、[ここ](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorRespondRecover/ErrorRespondRecover.html)と[ここにhttp://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ErrorHandlingCocoa/HandleReceivedError/HandleReceivedError.html)。 – Anomie

+0

NSErrorRecoveryAttemptingはiOS上で正常に動作します。 NSErrorヘッダーで確認できます。欠落しているのは、MacOS Xのような警告にエラーを渡す機能です。これは、エラー回復を実行するUIAlertViewにカテゴリを追加することによって非常に簡単です。これを行う方法のいくつかの例があります。 – quellish

0

私は上向きにエラーを転送するために、レスポンダチェーンを利用したい主な理由は、UIKitの中のAppKitのエラー処理メカニズムを反映しようとしています。私はこれを完全にはテストしていませんが、現時点では以下のようになります。

それはかなり密接のAppKitを反映しているが、意志は/フックはそれぞれカスタムエラープレゼンテーションとリカバリを実行するためにオーバーライドすることができませんでした。デフォルトの動作では、プレゼンテーションのためUIAlertViewを示し、回復のための擬似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 
関連する問題