2013-07-29 4 views
2

Je me demande comment puis-je mettre en œuvre le polymorphisme dans le StoryController iPhone XCode storyboard.Polymorphisme dans ViewControllers Storyboard

Voici mon problème: Deux ViewControllers différents dans mon application sont en train de se connecter à un ViewController commun.

Ce ViewController commun se comporte différemment en fonction du VC à partir duquel il a été séparé - différents appels de serveur API à distance et récupérations CoreData sont effectués (pour le premier, il présente tous les utilisateurs dans une table sous-classe d'utilisateurs, et je peux avoir un troisième qui présentera la liste filtrée des utilisateurs).

Ce ViewController commun est très centré dans mon application et se place en liaison avec de nombreux autres ViewControllers. Par conséquent, il ne me semble pas juste de le dupliquer sur le stroyboard avec une sous-classe.

Le passage de la liste des utilisateurs à ViewController est malheureusement moins une option, car différentes recherches dans cette liste sont effectuées et implémentées dans les méthodes de ViewController.

Il est logique d'implémenter ces différents comportements en sous-classifiant et en utilisant le polymorphisme, et en affectant le ViewController dans le storyboard à la sous-classe en fonction de la séquence d'origine.

Est-il possible de définir dynamiquement les classes de Storyboard ViewController lors de la navigation?

+0

Je ne vois aucune raison d'ajouter une propriété dans votre contrôleur de vue commune pour déterminer le contrôleur d'uiview dont vous êtes en train de capturer les appels appropriés. – limon

+0

@mstfbsnli Je vois votre point, mais je cherche des classes plus maigres et une solution de code plus propre. J'essaie d'éviter les conditions if-else if-else sur les différentes méthodes VC –

Répondre

2

différents appels de serveur API à distance et récupérations CoreData sont effectuées

Qu'est-ce que vous êtes vraiment crier ici est que l'interface de données est différente de l'interface de vue. C'est très bien. Vous devez extraire un objet distinct responsable de l'extraction des données. Vous pouvez passer cet objet au contrôleur de vue plutôt que de le polymériser. Ceci est appelé le modèle de stratégie, et est très commun dans Cocoa.

Ceci est presque identique à la délégation, que vous pouvez également utiliser ici. Lorsque vous créez une session, le contrôleur de vue appelant définit un délégué sur le contrôleur de vue récepteur. Ce délégué est alors chargé de renvoyer les objets de données, libérant à nouveau le contrôleur de vue récepteur de la polymorphisation.

+0

Cette réponse est excellente, et je vais implémenter cette approche mais je comprends que dans le même sens - il n'y a aucun moyen de définir dynamiquement la classe ViewController. Ai-je raison? –

+0

Il y a certainement un moyen :) ce n'est pas une bonne idée pour ce genre de problème. Vous pouvez isa-swizzle la classe de réception dans une classe différente à l'exécution. Mais ce serait une idée terrible ici. Isa-swizzling peut conduire à des bugs vraiment incroyables si vous faites des erreurs (comme ajouter un ivar dans la sous-classe, j'ai fait cette erreur une fois). –

+0

Pour plus d'informations: http://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ManagingDataFlowBetweenViewControllers/ManagingDataFlowBetweenViewControllers.html#//apple_ref/doc/uid/TP40007457-CH8-SW4 –

Questions connexes