2 votes

Sous-classement conditionnel en fonction de la version d'iOS

C'est peut-être un peu bizarre de demander cela, mais existe-t-il un moyen de sous-classer de manière conditionnelle en fonction de la version d'iOS, essentiellement :

if(iOS version >= 9) {
   @interface CDVWKWebViewEngine : CDVPlugin <CDVWebViewEngineProtocol, WKScriptMessageHandler, WKNavigationDelegate>
} else if(iOS version = 8) {
   @interface CDVWKWebViewEngine : CDVPlugin <WKScriptMessageHandler, WKNavigationDelegate>
}

J'ai l'iOS Plugin Cordova WkWebView Engine et souhaiterait revenir à l'UIWebView sous iOS 8 (ignorer le plugin sur iOS 8).

J'ai trouvé qu'il était plutôt délicat de rendre l'utilisation de ce plugin conditionnelle car il est si profondément ancré dans le projet une fois qu'il sous-classe le plugin par défaut UIWebView.

1voto

Amin Negm-Awad Points 3340

Il existe des macros de préprocesseur définies pour différentes versions

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
// code to compile for iOS 9 or greater
#else
// code to compile for les than iOS 9
#endif

Si vous voulez prendre la décision sur le temps d'exécution, vous pouvez utiliser -systemVersion ( UIDevice ) .

Bien sûr, il n'est pas possible de compiler une classe différente au moment de l'exécution comme vous l'avez prévu dans votre Q. Il existe deux façons de gérer cela :

  • Créer une classe au moment de l'exécution. Pour ce faire, vous avez besoin de l'ensemble du code des méthodes en cours de compilation et de l'assembler.

  • Sélectionnez la bonne classe (ou fragment de code comme l'a suggéré Brandon) parmi les classes compilées au moment de l'exécution.

Il existe différentes approches pour y parvenir. Si cela convient à votre structure, vous pouvez avoir une classe de base avec deux sous-classes privées et, lors de la création d'une instance dans la classe de base, vous décidez quelle instance de quelle sous-classe créer et livrer.

1voto

DarkDust Points 47584

Vous ne pouvez pas définir au moment de l'exécution à quels protocoles une classe se conforme car il s'agit d'une compiletime décision. (En fait, il y a es une façon d'utiliser l'API C de bas niveau comme class_addProtocol mais ce n'est pas nécessaire ici. Il ne faut pas toucher au runtime de cette façon, sauf si vous savez vraiment ce que vous faites).

Un protocole est surtout un indice pour le compilateur sur les méthodes que vous allez supporter. Il permet au compilateur d'émettre certains avertissements, comme l'absence d'implémentation des méthodes requises du protocole.

Dans votre cas, définissez simplement tous les protocoles dont vous avez besoin (l'"union" ; dans votre cas : les protocoles WKWebView et UIWebView) et implémentez ces méthodes. Ensuite, configurez vos objets au moment de l'exécution, si nécessaire. Cela signifie que, quelque part comme viewDidLoad décidez si vous avez besoin d'un WKWebView o UIWebView et le configurer en conséquence. Ou, si vous utilisez des XIBs, vous pouvez utiliser deux XIBs différents (un avec WKWebView, un autre avec UIWebView) et décider au moment de l'exécution lequel charger.

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