O novo método é:
[self dismissViewControllerAnimated:NO completion:nil];
A palavra modal foi removida; Como foi para a apresentação da chamada de API:
[self presentViewController:vc animated:NO completion:nil];
Os motivos foram discutidos em 2012 WWDC Session 236 - The Evolution of View Controllers on iOS Video. Essencialmente, os controladores de visualização apresentados por esta API não são mais sempre modais e, como estavam adicionando um manipulador de conclusão, era um bom momento para renomeá-lo.
Em resposta ao comentário de Marc:
Qual é a melhor maneira de oferecer suporte a todos os dispositivos 4.3 e superior? O novo método não funciona no iOS4, mas o método antigo está obsoleto no iOS6.
Sei que essa é uma questão quase separada, mas acho que vale a pena mencionar, já que nem todo mundo tem dinheiro para atualizar todos os seus dispositivos a cada 3 anos, portanto, muitos de nós temos alguns dispositivos mais antigos (anteriores ao 5.0). Ainda assim, por mais que me dói dizer, você precisa considerar se vale a pena focar abaixo de 5,0. Existem muitas APIs novas e interessantes não disponíveis abaixo do 5.0. E a Apple está continuamente tornando mais difícil atingi-los; O suporte armv6 foi retirado do Xcode 4.5, por exemplo.
Para atingir abaixo de 5,0 (contanto que o bloco de conclusão seja nulo), use o respondsToSelector
método handy :.
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
[self presentViewController:test animated:YES completion:nil];
} else {
[self presentModalViewController:test animated:YES];
}
Em resposta a outro comentário de Marc:
Isso poderia ser um monte de instruções If em meu aplicativo! ... Eu estava pensando em criar uma categoria que encapsulasse esse código, criar uma categoria em UIViewControler me faria ser rejeitado?
e um da Full Decent:
... existe uma maneira de fazer com que isso não apresente um aviso do compilador manualmente?
Em primeiro lugar, não, criar uma categoria por UIViewController
si só não fará com que seu aplicativo seja rejeitado; a menos que esse método de categoria seja chamado de APIs privadas ou algo semelhante.
Um método de categoria é um lugar extremamente bom para esse código. Além disso, como haveria apenas uma chamada para a API obsoleta, haveria apenas um aviso do compilador.
Para responder ao comentário (pergunta) do Full Decent, sim, você pode suprimir os avisos do compilador manualmente. Aqui está um link para uma resposta sobre o mesmo assunto . Um método de categoria também é um ótimo lugar para suprimir um aviso do compilador, já que você está suprimindo o aviso em apenas um lugar. Você certamente não quer sair por aí silenciando o compilador à toa.
Se eu fosse escrever um método de categoria simples para isso, poderia ser algo assim:
@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]; }
existe uma maneira de fazer com que manualmente não apresente um aviso do compilador?Agora no iOS 6 e superior, você pode usar:
Ao invés de:
... E você pode usar:
Ao invés de
fonte
[self dismissModalViewControllerAnimated:NO];
foi descontinuado.Use em seu
[self dismissViewControllerAnimated:NO completion:nil];
lugar.fonte
Usar
fonte
O aviso ainda está lá. Para me livrar dele, coloquei-o em um seletor assim:
Beneficia pessoas com TOC como eu;)
fonte
respondsToSelector
retorno falso. Assim, o novodismissViewControllerAnimated:
não será chamado até uma atualização futura, onde eles podem ser removidosdismissModalViewControllerAnimated:
completamente.Aqui está a versão correspondente do presentViewController que usei se ela ajudar outros novatos como eu:
Eu usei um ViewController 'genericamente' e consegui fazer com que a View modal aparecesse de forma diferente dependendo do que foi chamada para fazer (usando setHidden e setImage). e as coisas estavam funcionando bem antes, mas performSelector ignora as coisas de 'definir', então no final parece ser uma solução ruim se você tentar ser eficiente como eu tentei ser ...
fonte