Новий метод:
[self dismissViewControllerAnimated:NO completion:nil];
Слово модальне видалено; Як це було для представлення виклику API:
[self presentViewController:vc animated:NO completion:nil];
Причини були обговорені на сесії 236 WWDC - Еволюція контролерів перегляду на iOS Video. По суті, контролери перегляду, представлені цим 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];
}
У відповідь на ще один коментар Марка:
Це може бути дуже багато, якби висловлювання у моїй програмі! ... Я думав створити категорію, яка інкапсулювала цей код, чи створила б категорію на 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