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 ?

Était-ce utile?

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 viewControllersde 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

enter image description here

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top