101 votes

dismissModalViewControllerAnimated obsolète

J’ai juste amélioré à XCode 4.5 pour mettre à jour mon application iOS pour exécuter sur l’écran de 4 pouces pour l’iPhone 5, mais je me fais dire de génération d’erreur `` sur la ligne :

J’ai essayé de mettre à jour à la surcharge recommandée avec un gestionnaire achèvement (mais la valeur NULL) comme ceci :

Mais alors cette ligne lève deux erreurs :

Merci !

305voto

NJones Points 20265

La nouvelle méthode est:

[self dismissViewControllerAnimated:NO completion:nil];

Le verbe modal a été supprimé; Comme il l'a été pour la présentation d'appel d'API:

[self presentViewController:vc animated:NO completion:nil];

Les raisons ont été discutées dans la 2012 de la WWDC Session 236 - L'Évolution de Vue des Contrôleurs sur iOS Video. Essentiellement, la vue des contrôleurs présenté par cette API ne sont plus toujours modal, et depuis qu'ils ont été l'ajout d'un gestionnaire d'achèvement c'était un bon moment pour le renommer.

En réponse au commentaire de Marc:

Quelle est la meilleure façon de soutenir tous les appareils 4.3 et au-dessus? La nouvelle la méthode ne fonctionne pas dans la version iOS4, encore l'ancienne méthode est déconseillée dans iOS6.

Je me rends compte que c'est presque une question distincte, mais je pense que ça vaut la peine de mentionner, puisque le monde n'a pas l'argent pour mettre à niveau tous leurs appareils tous les 3 ans, donc beaucoup d'entre nous ont certains anciens (pré 5.0) des dispositifs. Toujours, autant que cela me fait mal de le dire, vous devez vous demander si cela vaut la peine de ciblage est inférieur à 5,0. Il y a beaucoup de nouveau et cool Api non disponible ci-dessous 5.0. Et Apple est en permanence rendant plus difficile la cible; armv6 soutien est passé de Xcode 4.5, par exemple.

Afin de cibler au-dessous de 5.0 (tant que la fin du bloc est nul) utilisez la poire respondsToSelector: la méthode.

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [self presentViewController:test animated:YES completion:nil];
} else {
    [self presentModalViewController:test animated:YES];
}

En réponse à un autre commentaire de la part de Marc:

Qui pourrait être tout à fait beaucoup de Si les déclarations dans mon application!...J'ai été la pensée de la création d'une catégorie qui résume ce code, la création de la catégorie sur UIViewControler me faire rejeté?

et une de Plein Décent:

...est-il un moyen de configurer manuellement que de ne pas présenter un avertissement du compilateur?

Tout d'abord, non, la création de la catégorie sur UIViewController dans et de lui-même n'obtiendrez pas votre application rejetée, à moins que cette catégorie de méthode appelée Api privées ou quelque chose de similaire.

Une catégorie de la méthode est extrêmement bon endroit pour ce type de code. Aussi, puisqu'il n'y aurait qu'un appel à l'API obsolètes, il y aurait seulement un avertissement du compilateur.

Pour l'adresse Complète Décent commentaire(question), oui, vous pouvez supprimer les avertissements du compilateur manuellement. Voici un lien vers une réponse sur DONC sur ce sujet. Une catégorie de méthode est également un excellent endroit pour supprimer un avertissement du compilateur, puisque vous êtes seulement la suppression de l'avertissement dans un seul endroit. Vous ne voulez certainement pas à aller autour de taire le compilateur bon gré mal gré.

Si je devais écrire une simple catégorie de méthode pour cela, il pourrait être quelque chose comme ceci:

@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

6voto

Dips Points 489

Maintenant dans l’iOS 6 et plus, vous pouvez utiliser :

Au lieu de :

... Et vous pouvez utiliser :

Au lieu de

4voto

Jayprakash Dubey Points 1194

``a été désapprouvée.

Utilisation `` à la place.

4voto

Mohan Chaudhari Points 386

Utilisation

3voto

kjoelbro Points 374

L’avertissement est toujours là. Afin de se débarrasser de lui je l’ai mis dans un sélecteur comme ceci :

Elle bénéficie aux personnes avec le trouble obsessionnel-compulsif comme moi  ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X