Новый метод:
[self dismissViewControllerAnimated:NO completion:nil];
Слово модальное было удалено; Как это было для вызова API представления:
[self presentViewController:vc animated:NO completion:nil];
Причины обсуждались в 2012 WWDC Session 236 - Эволюция контроллеров представления в iOS Video. По сути, контроллеры представлений, представленные этим API, больше не всегда являются модальными, и, поскольку они добавляли обработчик завершения, это было хорошее время для его переименования.
В ответ на комментарий Марка:
Как лучше всего поддерживать все устройства 4.3 и выше? Новый метод не работает в iOS4, но старый метод устарел в iOS6.
Я понимаю, что это почти отдельный вопрос, но я думаю, что об этом стоит упомянуть, поскольку не у всех есть деньги на обновление всех своих устройств каждые 3 года, поэтому у многих из нас есть старые (до 5.0) устройства. Тем не менее, как бы мне ни было больно об этом говорить, вам нужно подумать, стоит ли устанавливать таргетинг ниже 5.0. Есть много новых интересных API, недоступных ниже 5.0. И Apple постоянно затрудняет их нацеливание; Например, поддержка armv6 исключена из Xcode 4.5.
Чтобы настроить таргетинг ниже 5,0 (пока блок завершения равен нулю), просто используйте handy respondsToSelector
: method.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
В ответ на еще один комментарий Марка:
В моем приложении может быть довольно много операторов If! ... Я думал о создании категории, которая инкапсулирует этот код, может ли создание категории в UIViewControler привести меня к отказу?
и один от Full Decent:
... есть ли способ вручную заставить это не отображать предупреждение компилятора?
Во-первых, нет, создание категории UIViewController
само по себе не приведет к отклонению вашего приложения; если этот метод категории не называет частные API или что-то подобное.
Категориальный метод - очень хорошее место для такого кода. Кроме того, поскольку будет только один вызов устаревшего API, будет только одно предупреждение компилятора.
Чтобы ответить на комментарий (вопрос) Full Decent, да, вы можете вручную подавить предупреждения компилятора. Вот ссылка на ответ по этому поводу . Метод категории также является отличным местом для подавления предупреждения компилятора, поскольку вы подавляете предупреждение только в одном месте. Вы, конечно же, не захотите волей-неволей заставить компилятор замолчать.
Если бы мне пришлось написать для этого простой метод категорий, это могло бы быть примерно так:
@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