Come posso sottoclasse una variabile con un IBoutlet?
Domanda
Tutti i discendenti della mia classe specifica devono avere una variabile di istanza UILabel
.Quindi nella mia classe madre ho var label: UILabel
.Voglio averlo anche nella sublclass, ma come IBOutlet
.Come faccio a farlo?
Ho aggiunto il IBOutlet
con lo stesso nome e ha aggiunto debole a entrambe le dichiarazioni variabili.Ma ottengo un errore circa "non può sovrascrivere con una proprietà memorizzata".
Come dovrei farlo?Ed è possibile non dover istanziare la versione superclass 'come lo voglio solo per la sottoclassamento?
Soluzione
Basta aggiungere il modificatore IBOutlet
nella superclasse.
Altri suggerimenti
In tal modo sei generatoDicetagCode la proprietà re-declaring
in una sottoclasse. label
è solo una nozione del compilatore per lavorare con il costruttore di interfaccia.
in Swift Proprietà memorizzate non può essere sovrascritta o ridotta in una sottoclasse. Possono essere ereditati solo.
Tuttavia è possibile sovrascrivere il IBOutlet
e getter
di un setter
nelle sottoclassi per fornire validazioni o funzionalità extra. Fare riferimento alla Guida Swift: Override properties
è necessario dichiarare la tua proprietà in superclass con getter setter
.
o puoi creare una proprietà diversa nella tua sottoclasse. Come anche non c'è un senso se si collega la tua proprietà in una delle sottoclassi (super classe potrebbe avere altri) e non stai fornendo questa implementazione ad altre sottoclassi della tua superclass.
Modifica : È inoltre possibile impostare la presa IBOutlet
su due diversi label
of del viewControllers
da Story Board se si offrono nomi di SuperClass
in Storyboard a diversi controller di visualizzazione.
Basta definire
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
.
Subclasses
Repersent SubClass1
tagCode in Storyboard Derivato da view controller1
SuperClass
repersent un altro SubClass2
in Storyboard derivato da view controller2
Than Vai a SuperClass
e aprire Assistant Editor
Un lato e altro lato SuperClass
e Connect Outlet da view controller1
a SuperClass
in Storyboard in label
.Drag da view controller1
SuperClass
a Storyboard in label
Ora Aprire di nuovo view controller1
Un lato e altro lato SuperClass
e Connect Outlet da view controller2
a SuperClass
in Storyboard in label
.Drag da view controller2
SuperClass
a Storyboard in label
Se fai clic su Outlet view controller2
di quanto vedrete due etichette connessete in diversi viewControllers
Concordò che la risposta breve è semplicemente:
."Basta aggiungere il modificatore
@IBOutlet
nella superclass."
Una nota però: Se esponga il viewcontroller in cui il @IBOutlet
è definito tramite un framework (con Cartagine), è necessario aggiungere l'attributo public
alla definizione della variabile. Modifica: Invece, utilizzare la parola chiave di accesso open
.
Diciamo di avere un controller di visualizzazione CustomEviewController Subclassing Uivola ViewController , che si costruirà nel quadro consegnato a Carthage. Tutto ciò che dovrebbe essere accessibile all'applicazione dei consumatori dovrebbe essere taggato public
:
public class CustomViewController: UIViewController {
override public func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!
.
La cosa bella di questo approccio (e io sono totalmente a bordo con questo caso d'uso) è che è possibile eseguire la mappatura IBoutlet nel costruttore di interfaccia sulla superclasse, quindi cambiare la classe di la scena alla sottoclasse, mantenendo tutte le mappature.
E.G.: SubclassedCusticeViewController
import UIKit
import mymodule
class SubclassedCustomViewController: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
myBackgroundView.backgroundColor = UIColor.blueColor()
myLabel.text = "My special subclass text"
}
. Mi rendo conto che questa domanda è stata pubblicata ogni tempo fa, ma da quando ho appena lottato con lo stesso problema e finalmente ha trovato una soluzione, ho pensato che avrei comunque postato le mie scoperte ...
Capisco il problema come segue (almeno questo è quello che ho risolto):
Come avere la classe A ereditarita dalla classe B, con ogni classe avente il proprio file XIB con alcune proprietà IBOUTlet comuni? L'obiettivo deve essere in grado di avere la super classe che maneggia le azioni correlate Ai Iboulet che sono comuni alla sua sottoclasse (ES), pur essendo in grado di utilizzare il costruttore di interfaccia per progettare l'interfaccia per la sottoclasse (ES). *
Per farlo:
- .
- Rendi le connessioni IBoutlet nella superclasse dal Programmi XIB superclass
- Rendi le connessioni IBoutlet nella sottCLASSA dalla sottCLASS 'XIB File, con gli stessi nomi di proprietà IBoutlet come nella superclasse per quelli che devi ereditare.
- Elimina la dichiarazione delle variabili IBoutlet nella sottCLASSA