Comment utiliser le polymorphisme pour permettre à une méthode d'accepter plusieurs classes, mais avec IBOutlets ?

StackOverflow https://stackoverflow.com//questions/25089654

  •  02-01-2020
  •  | 
  •  

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 ?

Était-ce utile?

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 enter image description here

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

enter image description here

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