11
votes

iOS - Quand créer un enfant ViewController contre une sous-classe UIView?

Peut-être que c'est une question idiote, mais je me suis heurté à un certain nombre de fois au développement de l'IOS.

Parfois, je vais développer une composante de vue que je souhaite utiliser sur plusieurs écrans, donc je déciderai de la sous-classe uiview et de le faire quelque chose que je peux utiliser dans plusieurs endroits.

Alors, je commence à ajouter de la fonctionnalité. Peut-être qu'il doit répondre à un nsnotification ou est censé répondre aux touches utilisateur.

À un certain point, je commence à me demander si je devrais vraiment faire une sous-classe uiviewcontroller et l'ajoutez à mon UI en tant que visiteuse enfant.

Y a-t-il un consensus sur l'endroit où dessiner la ligne entre ajouter des comportements à un uiview , et quand créer un complet uiviewcontroller ?


0 commentaires

3 Réponses :


0
votes

J'ai utilisé les contrôleurs de vue intégrés pour charger des vues de table réutilisables de temps en temps. J'ai trouvé que c'était utile parfois mais pas toujours. La communication entre les deux peut être encombrante, comme si vous souhaitez que le contrôleur intégré communiquera vers le conteneur. La délégation le rend plus facile mais toujours encombrant. Il vous limite également à iOS 6, si je me souviens de la bonne iOS 5 et de la baisse, ne prenez pas de soutien aux contrôleurs intégrés.

S'il s'agit simplement d'ajouter des méthodes, vous pouvez utiliser une catégorie pour stocker certaines méthodes supplémentaires. Je fais beaucoup de choses sur NsmanageDObjects que je ne veux pas sous-classe et si je régénère le NsmanagedObject du Datamodel, je ne perds pas le code dans mes catégories. Me donne des fonctionnalités ajoutées comme des champs calculés ou des méthodes de conversion sans avoir à la sous-classement. Si vous n'avez pas besoin de ces méthodes d'instance particulière, excluez simplement la référence à la catégorie.

La sous-classement n'est jamais mauvaise si IMO.


0 commentaires

5
votes

Vous devez utiliser un contrôleur à tout moment que vous devez manipuler ou contrôler les données. Les points de vue sont censés être aussi stupides que possible, ne sachant pas ce qu'ils affichent, mais plutôt où. Vous pouvez facilement sous-classer et réutiliser les fichiers de vue. Un bon exemple, disons que vous devez récupérer une chaîne (ou un texte) de l'utilisateur dans votre application via un contrôleur Popover et un modal. Créez une sous-classe générique de uiviewcontroller qui a une vue avec un champ de texte et un bouton. Vous pouvez ensuite utiliser cette vue et son contrôleur dans n'importe quelle capacité dont vous avez besoin. La réutilisant dans la popover, modale ou nulle part ailleurs (et transmettre généralement les données à travers la délégation). Depuis que vous avez affaire à des données, vous ne devez pas utiliser une sous-classe unique d'UIView.

de mon expérience I Sous-classe UIViewControls Plus souvent, alors uIViews . C'est un peu difficile pour moi de comprendre si vous parlez exclusivement de conteneurs ou de réutilisation de vues dans le flux de travail d'application général. De toute façon si cela devrait être le même.


3 commentaires

Beau. Cela a toujours été mon inclination aussi.


L'affaire qui m'a incité à poster ceci était en fait pour quelque chose qui ne sera pas réutilisé. C'est très spécifique à un écran spécifique. Cependant, le composant a beaucoup de plomberie, et cela ressentait vraiment comme s'il avait besoin d'une meilleure séparation de la vue Contentroller est inclus dans.


Oui, je sais ce que vous voulez dire. La sous-classement Un UIViewController pour une situation spécifique n'est pas une mauvaise idée, mais essayez de les rendre aussi génériques que possible. Comme dans mon exemple, ne le nommez pas colornamecollector ou quelque chose parce qu'il ne peut être utilisé que pour obtenir des couleurs. Nommez plutôt quelque chose comme stringcollector . De cette façon, il est plus générique et peut être utilisé chaque fois que vous avez besoin d'obtenir une chaîne de l'utilisateur, quel que soit le lieu ou la manière dont il est présenté / utilisé.



5
votes

Je ne peux pas vous parler du consensus, mais voici mon avis:

Sous-classe uIView uniquement lorsque ...

  • Vous voulez faire du dessin personnalisé
  • Vous devez personnaliser certains comportements d'un UIView déjà existant Sous-classe
  • Vous avez des besoins spéciaux pour les sous-espaces de mise en page. La plupart des dispositions peuvent être effectuées par uiviewcontroller , cependant.
  • Peut-être pour une manipulation tactile spéciale que vous ne pouvez pas être faite avec des reconnaissants de gestes

    Sous-classe UIViewController dans tous les autres cas. Vous avez presque toujours besoin d'un contrôleur de toute façon, pour écrire du code de colle qui lie des vues et des modèles, ou pour la gestion des interactions utilisateur. Par conséquent, Apple a permis à Uikit de laisser les contrôleurs faire tout le travail et de garder des vues aussi "stupides" que possible. Par exemple, il est très simple de nier les contrôleurs pour créer des hiérarchies de vue complexes, sans qu'il soit nécessaire de disposer d'une sous-classe de visualisation unique.

    Un indicateur que le sous-classement uiview n'est pas la première chose à faire est la section intitulée "Alternatives au sous-classement" dans le référence de classe UIView . Un indicateur que le sous-classement uiviewcontroller est la chose préférée à faire est qu'il n'y a pas de cette section de ce type dans le Référence de la classe UIViewController : -)


2 commentaires

@Herzbube Pensez-vous que c'est pourquoi nous avons maintenant une vue sur le conteneur avec des VC enfants dans IB? Est-ce la voie à suivre pour partager des parties de notre UI entre les scènes (comme une image de profil + Nom + Status Dot)?


@Allaire Les commentaires ne sont pas vraiment utiles pour les discussions, et ils ne sont pas destinés à être ainsi. Vous pourriez peut-être commencer cette discussion dans une chaîne de discussion pour obtenir une opinion. Cela étant dit, j'avoue que 1) Je n'ai jamais utilisé l'IB beaucoup; 2) J'ai été plutôt déconnecté du développement iOS depuis plusieurs mois maintenant, donc je ne sais pas vraiment ce que l'IB donne à Devs ces jours-ci et comment Apple pense qu'il devrait être utilisé. Peut-être regarder une vidéo technique ou deux?