Comment utiliser le polymorphisme pour permettre à une méthode d'accepter plusieurs classes, mais avec IBOutlets ?
Question
J'ai une méthode spécifique qui accepte un UIView
objet, et je veux lui transmettre des objets qui peuvent appartenir à l’une des deux classes.Alors disons qu'il accepte un UIView
qui représente un animal, je veux pouvoir passer un DogView
et un CatView
ou d'autres classes de types d'animaux potentiellement.
Dans cette méthode, je veux définir le nameLabel
vue que possèdent tous les animaux.Comment puis-je le configurer pour pouvoir faire cela ?
Ma première réaction a été d'avoir une super classe (comme AnimalView
) qui a le nameLabel
variable dessus, puis sous-classez-la pour chaque nouvel animal.Cependant, si je veux le nameLabel
pour être un point de vente, cela ne semble pas réglable car je ne pouvais pas avoir la variable dans chaque sous-classe pour câbler la vue dans IB.
J'ai ensuite essayé un Protocol
, mais ce n'est pas polymorphe et je ne pourrais pas accéder à la propriété nameLabel via une superclasse générique, n'est-ce pas ?Contrairement à Objective-C, je ne pouvais pas demander un UIView <ProtocolName>
et cela me permettrait alors de le demander.
Comment dois-je procéder ?Je veux juste pouvoir transmettre différents types d'objets et les rendre compatibles avec Interface Builder.Dois-je l’aborder complètement différemment ?
La solution
Vous pouvez connecter une prise de label
à différent viewControllers
avec votre SuperClass
du story-board si tu es différent viewControlelrs
dans un storyboard repéré par Subclasses
(dérivé de SuperClass) noms dans le storyboard.
1)Définissez simplement
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
représenter view controller1
dans un storyboard dérivé de SuperClass
SubClass2
représenter un autre view controller2
dans un storyboard dérivé de SuperClass
2) Ensuite, allez à Assistant Editor
et ouvert SuperClass
un côté et l'autre côté view controller1
et connectez la prise de SuperClass
à label
dans le storyBoard dans view controller1
.Faites glisser depuis SuperClass
label
au storyBoard dans view controller1
3) Maintenant à nouveau ouvert SuperClass
un côté et l'autre côté view controller2
et connectez la prise de SuperClass
à label
dans le storyBoard dans view controller2
.Faites glisser depuis SuperClass
label
au storyBoard dans view controller2
Si vous cliquez sur SuperClass
sortie, vous verrez deux étiquettes connectées à différents viewControllers
Autres conseils
Déclarer le IBOutlet
dans un superclass
, AnimalView
.Puis dans Interface Builder, une fois que vous avez défini la personnalisation UIView's
classe dans l'inspecteur d'identité à être DogView
, accédez à l'inspecteur de connexions et à votre nameLabel
sera là.
@interface Parent : UIView
@property (nonatomic,weak) IBOutlet UILabel *nameLabel;
@end
@interface Child : Parent
@end