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?

È stato utile?

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 labelof 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 SubClass1tagCode 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

Inserisci Descrizione dell'immagine qui

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top