Comment sous-classer une variable avec un IBOutlet ?
Question
Tous les descendants de ma classe spécifique doivent avoir un UILabel
variable d'instance.Donc, dans ma classe parentale, j'ai var label: UILabel
.Je veux l'avoir aussi dans la sous-classe, mais en tant que IBOutlet
.Comment puis-je faire cela?
J'ai ajouté le IBOutlet
du même nom, et ajouté faible aux deux déclarations de variables.Mais j'obtiens une erreur concernant "Impossible de remplacer une propriété stockée".
Comment dois-je procéder ?Et est-il possible de ne pas avoir à instancier la version de la superclasse car je la veux juste pour le sous-classement ?
La solution
Ajoutez simplement le IBOutlet
modificateur dans la superclasse.
Autres conseils
Ce faisant, vous êtes re-declaring
le label
propriété dans une sous-classe. IBOutlet
est juste une notion de compilateur pour travailler avec Interface Builder.
En Swift propriétés stockées ne peut pas être remplacé ou redéclaré dans une sous-classe.Ils ne peuvent être hérités.
Cependant, vous pouvez remplacer le getter
et setter
d'un properties
dans des sous-classes pour fournir des validations ou des fonctionnalités supplémentaires.Reportez-vous au guide Swift : passer outre getter setter
Vous devez déclarer votre propriété en superClass avec IBOutlet
.
Ou vous pouvez créer une propriété différente dans votre sous-classe.De plus, cela n'a aucun sens si vous connectez votre propriété à l'une des sous-classes (la super classe peut en avoir d'autres) et que vous ne fournissez pas cette implémentation à d'autres sous-classes de votre superclasse.
MODIFIER:Vous pouvez également définir label
sortie vers deux viewControllers
de votre SuperClass
du story board si vous donnez Subclasses
noms dans le storyboard pour différents contrôleurs de vue.
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
Que d'aller à 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
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
Je suis d'accord que la réponse courte est simplement :
"Ajoutez simplement le
@IBOutlet
modificateur dans la superclasse.
Une remarque cependant :si vous exposez le ViewController dans lequel le @IBOutlet
est défini via un framework (avec Carthage), il faudra ajouter le public
attribut à la définition de variable. MODIFIER:utilisez plutôt open
accéder au mot-clé`.
Disons que vous avez un contrôleur de vue CustomViewController sous-classement UITableViewController, que vous construirez dans le cadre fourni par Carthage.Tout ce qui doit être accessible à l'application grand public doit être étiqueté public
:
public class CustomViewController: UIViewController {
override public func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!
Ce qui est bien avec cette approche (et je suis totalement intégré à ce cas d'utilisation) est que vous pouvez effectuer le mappage IBOutlet dans Interface Builder sur la superclasse, puis basculer la classe de Scene vers la sous-classe, tout en conservant tous les mappages.
Par exemple.: Sous-classeCustomViewController
import UIKit
import mymodule
class SubclassedCustomViewController: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
myBackgroundView.backgroundColor = UIColor.blueColor()
myLabel.text = "My special subclass text"
}
Je me rends compte que cette question a été postée il y a quelque temps, mais comme j'ai juste eu du mal avec le même problème et que j'ai finalement trouvé une solution, j'ai pensé que je publierais quand même mes conclusions...
Je comprends que le problème est le suivant (du moins c'est celui que j'ai résolu) :
Comment faire en sorte que la classe A hérite de la classe B, chaque classe ayant son propre fichier XIB avec certaines propriétés IBOutlet communes ? Le but étant de pouvoir faire en sorte que la super classe gère les actions liées aux IBOutlets communes à sa(ses) sous-classe(s), tout en pouvant toujours utiliser Interface Builder pour concevoir l'interface de la(des) sous-classe(s).*
Afin de le faire:
- Faites les connexions Iboutlet dans la superclasse à partir des fichiers XIB de superclasse
- Faites les connexions Iboutlet dans la sous-classe à partir des fichiers XIB de la sous-classe, avec les mêmes noms de propriétés Iboutlet que dans la superclasse pour ceux que vous devez hériter.
- Supprimer la déclaration des variables IBOutlet dans la sous-classe