Wie erstelle ich eine Unterklasse einer Variablen mit einem IBOutlet?
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?
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 viewControllers
von 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
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