Как правильно использовать NSErrorRecoveryAttempting, NSError и UIAlertView в iOS? - PullRequest
13 голосов
/ 11 мая 2011

У меня проблемы с поиском примеров правильного использования NSError, UIAlertView и NSErrorRecoveryAttempting вместе на iOS.Большая часть документации и примеров, которые я могу найти, покрывают эквивалентную функциональность в OS X, где соответствующие поведения интегрированы Какао.Но в iOS, кажется, необходимо сделать это «вручную», и я не могу найти хороших примеров того, как это делается.

Я был бы очень признателен за несколько примеров лучшей практики использования информациив NSError для поддержки попыток восстановления из NSErrors, сообщенных пользователю.

Ответы [ 3 ]

6 голосов
/ 18 мая 2011

Согласно документации Apple:

Внимание! Класс NSError доступен как в Mac OS X, так и в iOS. Однако 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 голосов
/ 07 марта 2013

Я нашел отличный пример этого.

См. Следующий пост в блоге и код GitHub (включая пример проекта) Джеймса Бейта

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

https://github.com/realmacsoftware/RMErrorRecoveryAttempter

Мне удалось успешно использовать это на симуляторе iPhone.

1 голос
/ 26 октября 2012

Я пытаюсь отразить механизм обработки ошибок AppKit в UIKit, главным образом потому, что я хочу использовать цепочку респондента для пересылки ошибок вверх.Я не проверял это полностью, но на данный момент он выглядит следующим образом.

Он довольно близко отражает 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
...