Ответ 1
Новый метод:
[self dismissViewControllerAnimated:NO completion:nil];
Слово модальное было удалено; Как и в случае вызова API для представления:
[self presentViewController:vc animated:NO completion:nil];
Причины обсуждались в разделе 2012 WWDC Session 236 - The Evolution of View Controllers на iOS. По сути, контроллеры представлений, представленные этим API, уже не являются модальными, и поскольку они добавляли обработчик завершения, было подходящее время для его переименования.
В ответ на комментарий от Марка:
Какой лучший способ поддерживать все устройства 4.3 и выше? Новый метод не работает в iOS4, но старый метод устарел в iOS6.
Я понимаю, что это почти отдельный вопрос, но я думаю, что это стоит упомянуть, так как не все имеют деньги для обновления всех своих устройств каждые 3 года, поэтому многие из нас имеют некоторые более старые (до 5.0) устройства. Тем не менее, насколько мне больно это говорить, вам нужно подумать, стоит ли таргетировать ниже 5.0. Есть много новых и классных API, которые не доступны ниже 5.0. И Apple постоянно усложняет их настройку; Например, поддержка armv6 исключается из Xcode 4.5.
Чтобы настроить таргетинг ниже 5.0 (до тех пор, пока блок завершения равен нулю), просто используйте удобный respondsToSelector
: метод.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
В ответ на другой комментарий от Марка:
Это может быть довольно много утверждений If в моем приложении!... Я был думать о создании категории, которая инкапсулировала этот код, создавая категорию в UIViewControler, меня отклонили?
и один из полного подтверждения:
... есть ли способ вручную заставить это не сообщать о компиляторе?
Во-первых, нет, создание категории на UIViewController
само по себе не приведет к отклонению вашего приложения; если этот метод категории не называется private API или что-то подобное.
Метод категории является чрезвычайно хорошим местом для такого кода. Кроме того, поскольку будет только один вызов устаревшего API, будет только одно предупреждение компилятора.
Чтобы адресовать полный достойный комментарий (вопрос), да, вы можете подавить предупреждения компилятора вручную. Вот ссылка на ответ на SO по этому вопросу. Метод категории также является прекрасным местом для подавления предупреждения компилятора, поскольку вы только подавляете предупреждение в одном месте. Вы, конечно, не хотите обойти молчание компилятора волей-неволей.
Если бы я написал простой метод для этого, это могло бы быть примерно так:
@implementation UIViewController (NJ_ModalPresentation)
-(void)nj_presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion{
NSAssert(completion == nil, @"You called %@ with a non-nil completion. Don't do that!",NSStringFromSelector(_cmd));
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:viewControllerToPresent animated:flag completion:completion];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[self presentModalViewController:viewControllerToPresent animated:flag];
#pragma clang diagnostic pop
}
}
@end