Предупреждение о вызове метода Apple

У меня очень интересная проблема. В моем приложении возникла проблема с presentViewController:animated:completion: и dismissViewControllerAnimated:completion:. Произошло то, что вызывается presentViewController, и, основываясь на информации о сервере, возможно, что View Controller будет отклонен. Я получаю сообщение об ошибке «Невозможно закрыть, пока оно не будет полностью представлено» (для анимации установлено значение «ДА»).

Я реализовал очередь для обработки текущих вызовов и отклонения вызовов. Это работает отлично, и я очень доволен этим решением. Затем я понял еще одну проблему: что, если я случайно вызову методы Apple напрямую (у меня есть методы с именами myPresentViewController:animated:completion: и myDismissViewControllerAnimated:completion:, которые обрабатывают очередь).

Есть ли способ настроить метод предупреждения, если я напрямую вызову методы Apple? Я попытался создать Категорию (я также пробовал Расширение), определить методы Apple Present и Disk, а также добавить к ним устаревшее сообщение. Ни один из этих способов не работал. Я думал об изменении методов, но это не работает, потому что, если метод swizzled добавит его в очередь, как он узнает, когда вызывать реализацию Apple? Я понимаю, что предупреждение появится в одном месте, где мне нужно вызвать метод Apple, но я могу использовать #pragma, чтобы запретить предупреждения для двух строк, которые мне нужны.


person The Guardian    schedule 13.05.2014    source источник


Ответы (1)


Создайте базовый класс контроллера представления, который расширяет UIViewController. Затем убедитесь, что все ваши контроллеры представления расширяют этот базовый класс. Сделайте то же самое для UITableViewController, если необходимо.

В этих базовых классах вы можете реализовать два метода и добавить свой флаг устаревания в объявления методов в файле .h.

TGViewController.h

@interface TGViewController : UIViewConrtoller

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion NS_DEPRECATED_IOS(5_0, 6_0);
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion NS_DEPRECATED_IOS(5_0, 6_0);

@end

TGViewController.m

@implementation TGViewController

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion {
    [super presentViewController:viewControllerToPresent animated:flag completion:completion];
}

- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion {
    [super dismissControllerAnimated:flag completion:completion];
}

@end

Никаких прагм не нужно.

Вы также можете использовать эти базовые классы для добавления любых других функций уровня приложения, которые вам могут понадобиться.

person rmaddy    schedule 13.05.2014