Frage

Alle Nachkommen meiner spezifischen Klasse sollen eine haben UILabel Instanzvariable.Also in meiner Elternklasse habe ich var label: UILabel.Ich möchte es auch in der Unterklasse haben, aber als IBOutlet.Wie mache ich das?

Ich habe das hinzugefügt IBOutlet mit demselben Namen und fügte schwach zu beiden Variablendeklarationen hinzu.Ich erhalte jedoch die Fehlermeldung „Kann nicht mit einer gespeicherten Eigenschaft überschrieben werden“.

Wie soll ich das machen?Und ist es möglich, die Version der Superklasse nicht instanziieren zu müssen, da ich sie nur für die Unterklassenbildung möchte?

War es hilfreich?

Lösung

Fügen Sie einfach das hinzu IBOutlet Modifikator in der Superklasse.

Andere Tipps

Indem Sie dies tun, sind Sie es re-declaring Die label Eigenschaft in einer Unterklasse. IBOutlet ist lediglich ein Compiler-Konzept für die Arbeit mit dem Interface Builder.

In Swift gespeicherte Eigenschaften kann in einer Unterklasse nicht überschrieben oder neu deklariert werden.Sie können nur vererbt werden.

Sie können das jedoch überschreiben getter Und setter von einem properties in Unterklassen, um zusätzliche Validierungen oder Funktionalitäten bereitzustellen.Weitere Informationen finden Sie im Swift-Leitfaden: überschreiben getter setter

Sie müssen Ihre Immobilie in der SuperClass mit deklarieren IBOutlet.

Oder Sie können in Ihrer Unterklasse eine andere Eigenschaft erstellen.Ebenso hat es keine Bedeutung, wenn Sie Ihre Eigenschaft in einer der Unterklassen verbinden (die Superklasse kann andere haben) und Sie diese Implementierung nicht anderen Unterklassen Ihrer Superklasse zur Verfügung stellen.

BEARBEITEN:Sie können auch einstellen label Steckdose zu zwei verschiedenen viewControllersvon dir SuperClass vom Storyboard, wenn Sie geben Subclasses Namen im Storyboard zu verschiedenen Ansichtscontrollern hinzufügen.

Definieren Sie einfach

 class SuperClass{
     @IBOutlet weak var label: UILabel! = nil

 }

SubClass1 vertreten view controller1 im Storyboard abgeleitet von SuperClass SubClass2 einen anderen darstellen view controller2 im Storyboard abgeleitet von SuperClass

Dann gehen Sie zu Assistant Editor und offen SuperClass eine Seite und andere Seite view controller1 und Steckdose anschließen SuperClass Zu label im storyBoard in view controller1.Ziehen von SuperClass label zum storyBoard in view controller1

enter image description here

Jetzt wieder geöffnet SuperClass eine Seite und andere Seite view controller2 und Steckdose anschließen SuperClass Zu label im storyBoard in view controller2.Ziehen von SuperClass label zum storyBoard in view controller2

Wenn Sie auf klicken SuperClass Auslass, dann sehen Sie zwei Labels, die mit verschiedenen ViewControllern verbunden sind

Ich bin damit einverstanden, dass die kurze Antwort einfach lautet:

„Fügen Sie einfach das hinzu @IBOutlet Modifikator in der Superklasse.

Eine Anmerkung jedoch:wenn Sie den ViewController verfügbar machen, in dem die @IBOutlet über ein Framework (mit Carthage) definiert wird, müssen Sie das hinzufügen public Attribut zur Variablendefinition hinzufügen. BEARBEITEN:Verwenden Sie stattdessen open Zugriffsschlüsselwort`.

Nehmen wir an, Sie haben einen View-Controller CustomViewController Unterklassen UITableViewController, das Sie im von Carthage bereitgestellten Framework erstellen werden.Alles, was für die Verbraucheranwendung zugänglich sein soll, sollte getaggt werden public:

public class CustomViewController: UIViewController {

    override public func viewDidLoad() {
        super.viewDidLoad()
    }

@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!

Das Schöne an diesem Ansatz (und ich bin total (In diesem Anwendungsfall integriert) besteht darin, dass Sie die IBOutlet-Zuordnung im Interface Builder für die Oberklasse durchführen und dann die Klasse der Szene zur Unterklasse wechseln können, während Sie alle Zuordnungen beibehalten.

Z.B.: Unterklassiger CustomViewController

import UIKit
import mymodule

class SubclassedCustomViewController: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        myBackgroundView.backgroundColor = UIColor.blueColor()
        myLabel.text = "My special subclass text"
    }

Ich erkennen, dass diese Frage vor einiger Zeit veröffentlicht wurde, aber da ich gerade mit demselben Problem gekämpft hatte und endlich eine Lösung aufkam, dachte ich, ich würde immer noch meine Erkenntnisse posten ...

Ich verstehe das Problem, wie folgt zu sein (zumindest ist das, das ich gelöst habe):

wie man Klasse A erben von der Klasse B, wobei jede Klasse eine eigene XIB-Datei mit den einigen gängigen IBoutlet-Eigenschaften hat? Das Ziel ist, die Super-Klasse, um die Super-Klasse zu erhalten an die iBoutlets, die seiner Unterklasse (ES) gemeinsam sind, während der Schnittstellenbuilder immer noch verwenden kann, um die Schnittstelle für die Unterklasse (ES) zu entwerfen. *

um dies zu tun:

  • Machen Sie die IBoutlet-Verbindungen in der Superklasse von der Superclass 'Xib-Dateien
  • Erstellen Sie die IBoutlet-Verbindungen in der Unterklasse von der SubClass 'XIB Dateien mit den gleichen IBoutlet-Eigenschaftsnamen wie in der Superklasse für diejenigen, die Sie erben müssen.
  • Löschen Sie die Deklaration der IBoutlet-Variablen in der Unterklasse
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top