Question

Je refactorisation actuellement deux contrôleurs de vue que partagent quelques IBOutlets et méthodes de IBAction. Je me suis déplacé les déclarations de sortie et la méthode de IBAction dans une superclasse, coupant ceux-ci sur des sous-classes.

Maintenant, quand j'ouvre Interface Builder, je trouve que je ne vois pas les points de vente ou les actions déclarées dans la superclasse. Les connexions existent encore, comme je les avais câblé avant le refactoring, mais ils sont grisés. (Il est important de noter que les connexions aussi WORK, comme mes feux d'action sur un bouton, appuyez sur et mes sorties sont modifiées correctement.)

La question est, comment puis-je constructeur d'interface à reconnaître les prises d'une superclasse? Est-ce possible, et, sinon, qu'est-ce que vous recommandez tous?

(Juste pour le plaisir, voici mon fichier d'en-tête de superclasse:)

@interface TFMainViewController : UIViewController {
    UIImageView *logoImage, *thinkfunImage;
    UIButton *buyFullButton;        
}

@property (nonatomic, retain) IBOutlet UIImageView *logoImage, *thinkfunImage;
@property (nonatomic, retain) IBOutlet UIButton *buyFullButton;

-(IBAction) buyFullVersion;

@end

EDIT:. Au cas où quelqu'un se demande, j'utilise Xcode et IB 3.2.5, avec le SDK iOS 4.2

Était-ce utile?

La solution

Je ne savais pas qu'il était possible de se connecter à superclasses dans le générateur d'interface jusqu'à il y a environ une heure. Comme ce fut la seule question que je pouvais trouver sur la façon de faire, je vais ajouter ma réponse, même si cette question est ancienne. Ma réponse est à l'égard de Xcode 4, pas Xcode 3.

Pour autant que je peux dire, vous ne pouvez pas vous connecter à des prises dans une superclasse en utilisant l'éditeur adjoint, mais vous pouvez le faire en cliquant sur « Fichier du propriétaire » dans IB. Cela devrait montrer tous les points de vente dans Utilitaires-> Connexions Inspecteur. Vous pouvez ensuite Ctrl + clic sur la sortie de l'inspecteur (cliquez sur le signe « + »), et faites-le glisser vers votre point de vue dans l'IB.

Autres conseils

La solution pour le problème avec le IBOutlet .. est de changer le type de classe à la classe de base dans l'inspecteur de l'identité

entrer image description ici

connecter en utilisant la touche Ctrl + déposer et

entrer image description ici

changer à la classe des enfants

entrer image description ici

Cela fonctionne pour moi

BTW: i utilisé Xcode 6

IB devrait être en mesure de voir les prises de superclasses, je l'ai fait plusieurs fois sans problème. Etes-vous sûr que vous importez correctement la superclasse (à l'aide #import au lieu de @class)? IB a besoin d'un moyen de remonter jusqu'à la superclasse.

Commutation entre le super et la sous-classe dans l'inspecteur d'identité vous permet de connecter vos points de vente à travers les classes. Le seul problème que je trouve est quand vous essayez de le faire avec un UITableViewCell et sa sous-classe. Je voulais réattribuer les instances par défaut Textlabel et detailTextLabel aux étiquettes que je crée dans Interface Builder. La solution consiste à créer des étiquettes de substitution, puis remplacer les getters pour pointer vers celles-ci à la place.

Je suis sûr que IB ne regarde que la classe réelle que vous utilisez pour trouver des débouchés, et non à superclasse. Je pense que la meilleure solution serait de laisser les déclarations de variables d'instance dans la superclasse, mais dupliquer les lignes de @property dans chaque sous-classe.

Je fais cela dans XCode 3.2.6. J'ai commencé avec des sorties connectées à une classe, puis fait une sous-classe avec des sorties supplémentaires. Quand j'ai changé la classe propriétaire du fichier à la sous-classe, IB a montré les points de vente superclasse grisés. Je suis passé propriétaire du fichier à la superclasse, puis de nouveau à la sous-classe et maintenant tous les points de vente montrent non grisés.

La façon la plus simple: créer l'interface et les fichiers de mise en œuvre de votre sous-classe (s)
Parfait exemple: impressionnant de Juggleware ShadowButton de sous-classe UIButton.

Assurez-vous de créer les fichiers .h et .m dans votre projet. NOTE: Il n'y a pas besoin de #import les fichiers d'en-tête du tout puisque cela est tout simplement un instance de classe de UIButton.

Interface Builder :

  1. Sélectionnez l'élément auquel se connecter.
  2. Aller à Utilitaires -> Identité Inspecteur
  3. Modifier la classe à votre sous-classe (ou superclasse). REMARQUE:. Vous pourriez avoir à taper le nom de votre sous-classe et appuyez sur ENTRER

Vous avez terminé!

Même si vous avez déclaré une classe de base (UIButton) comme IBOutlet dans votre fichier d'en-tête comme si ...

// YourViewController.h

@interface YourViewController : UIViewController {

IBOutlet UIButton *mybutton;
}

... la classe que vous avez défini dans Interface Builder (ShadowButton), il remplacera car il est dans la couche de vue.

La meilleure partie de cette approche est que votre code n'a pas de problèmes de dépendance en désordre.

Sur le projet, je travaille actuellement, nous avons un BaseViewController avec un UIScrollView que l'apparence du clavier IBOutlet et poignées / événements de disparition et glisse le contenu en conséquence. Au début, je ne pouvais pas se connecter à ce IBOutlet, que résolu le problème comme celui-ci, qui est similaire à la réponse de Sosily:

  • BaseViewController a un IBOutlet, appelé contentScrollView. Je peux voir 5 points précédemment connectés, qui sont UIScrollViews sur d'autres UIViewControllers, créés par des personnes qui ont déjà travaillé sur le projet

  • J'ai essayé de connecter mon UIScrollView comme contentScrollView. Bien que mon UIViewController est une sous-classe de BaseViewController, je ne peux pas le connecter.

  • J'ai essayé de se connecter UIScrollViews déjà connecté comme contentScrollView. Bien que tous les UIViewControllers sont sous-classes de BaseViewController, je ne peux pas les connecter à nouveau, aussi bien. Alors, j'ai commencé à chercher un truc.

  • J'ai créé le même contentScrollView IBOutlet sur mon propre UIViewController, connecté le scrollView à ma propre prise contentScrollView et enlevé celui que je viens de créer.

  • Maintenant, le ScrollView est connecté comme contentScrollView au propriétaire du fichier, mais le seul contentScrollView appartient à la BaseViewController. Testé et vérifié que les événements du clavier sont gérées correctement.

je suis tombé sur un problème similaire avec une superclasse, mais il est dû à un bogue dans Xcode (8.2) où Interface Builder ne montre pas prises dans la connexion inspecteur si ces points de vente ont été déclarés avec une annotation de type _Nullable pour Swift compatibilité.

Utilisation de l'intérieur de nullable @ parenthèses de propriété semble de contourner le problème.

Ce bogue Xcode semble affecter points de vente dans toute la classe (ie. Pas seulement superclasse).

J'ai eu le même problème, et il se trouve qu'il était parce que dans la superclasse j'avais les IBOutlets déclarés comme « _Nullable ». Exemple:

@property (nonatomic, strong)   IBOutlet UITableView *_Nullable mySuperTableView;

Quand j'ai enlevé le _Nullable, tout à coup les IBOutlets réapparu dans IB et tout était bon à nouveau. (Je les avais mis à _Nullable parce que Xcode se plaignait « pointeur manque un spécificateur de type de nullité » ... (je ne sais pas pourquoi).)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top