Новый метод:
[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
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ [self presentViewController:test animated:YES completion:nil]; } else { [self presentModalViewController:test animated:YES]; }
есть способ вручную заставить это не отображать предупреждение компилятора?Теперь в iOS 6 и выше вы можете использовать:
Вместо того:
... И вы можете использовать:
Вместо того
источник
[self dismissModalViewControllerAnimated:NO];
устарела.[self dismissViewControllerAnimated:NO completion:nil];
Вместо этого используйте .источник
Использовать
источник
Предупреждение все еще существует. Чтобы избавиться от него, я помещаю его в такой селектор:
Это приносит пользу людям с ОКР, таким как я;)
источник
respondsToSelector
к возврату false. Таким образом, новыеdismissViewControllerAnimated:
никогда не будут вызываться до следующего обновления, из которого они, возможно, будутdismissModalViewControllerAnimated:
полностью удалены .Вот соответствующая версия PresentViewController, которую я использовал, если она помогает другим новичкам, таким как я:
Я использовал ViewController «в общем» и смог заставить модальный View выглядеть по-разному в зависимости от того, для чего он был вызван (с помощью setHidden и setImage). и раньше все работало хорошо, но PerformSelector игнорирует 'set', так что, в конце концов, это кажется плохим решением, если вы пытаетесь быть эффективным, как я пытался быть ...
источник