새로운 방법은 다음과 같습니다.
[self dismissViewControllerAnimated:NO completion:nil];
모달 이라는 단어 가 제거되었습니다. 제시하는 API 호출과 마찬가지로 :
[self presentViewController:vc animated:NO completion:nil];
그 이유는 2012 WWDC 세션 236-iOS 비디오 에서보기 컨트롤러의 진화 에서 논의되었습니다 . 기본적으로이 API에서 제공하는 뷰 컨트롤러는 더 이상 항상 모달이 아니며 완료 핸들러를 추가했기 때문에 이름을 바꾸는 것이 좋습니다.
Marc의 의견에 대한 답변 :
4.3 이상의 모든 장치를 지원하는 가장 좋은 방법은 무엇입니까? 새로운 방법은 iOS4에서 작동하지 않지만 이전 방법은 iOS6에서 더 이상 사용되지 않습니다.
나는 이것이 거의 별개의 질문이라는 것을 알고 있지만 모든 사람이 3 년마다 모든 장치를 업그레이드 할 돈이있는 것은 아니기 때문에 언급 할 가치가 있다고 생각합니다. 그래서 많은 사람들이 이전 (5.0 이전) 장치를 가지고 있습니다. 그래도 말하면 고통 스럽지만 5.0 미만을 타겟팅 할 가치가 있는지 고려해야합니다. 5.0 이하에서는 사용할 수없는 새롭고 멋진 API가 많이 있습니다. 그리고 애플은 계속해서 그들을 목표로 삼는 것을 더 어렵게 만들고 있습니다. 예를 들어 armv6 지원은 Xcode 4.5에서 삭제되었습니다.
5.0 미만을 목표로하려면 (완료 블록이 nil 인 한) handy respondsToSelector
: 메소드를 사용하십시오 .
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Marc의 또 다른 의견에 대한 답변 :
그것은 내 응용 프로그램에서 상당히 많은 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