2015-02-07 29 views
12

Qualcosa di strano in corso con IBOutlets. enter image description hereProprietà IBOutlet nil dopo la visualizzazione personalizzata caricata da xib

Nel codice che ho provo ad accedere a questa proprietà, ma sono nil. Codice:

class CustomKeyboard: UIView { 

    @IBOutlet var aButt: UIButton! 
    @IBOutlet var oButt: UIButton! 

    class func keyboard() -> UIView { 
     let nib = UINib(nibName: "CustomKeyboard", bundle: nil) 
     return nib.instantiateWithOwner(self, options: nil).first as UIView 
    } 

    override init() { 
     super.init() 
     commonInit() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     commonInit() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

    // MARK: - Private 
    private func commonInit() { 
     println(aButt) 
     // aButt is nil 

     aButt = self.viewWithTag(1) as UIButton 
     println(aButt) 
     // aButt is not nil 
    } 
} 
+0

Dove li accedendo oltre commonInit? –

+0

@AshrafTawfeeq ora da nessuna parte. Non posso iniziare questo corso in modo normale. Anche il progetto clean non aiuta – Sk0prion

+0

Gli outlets non sono ancora impostati al momento di init perché la vista non è stata caricata. Il tuo secondo log funziona perché l'accesso alla vista fa sì che venga caricato. – rdelmar

risposta

27

Quello che ci si aspetta, perché l'IBOutlet (s) non sono assegnati per il momento l'inizializzazione viene chiamato. Non è necessario il commonInit, appena un override di awakeFromNib come segue:

override func awakeFromNib() { 
    super.awakeFromNib() 

    print(aButt) 
} 
0

E come è stata avviata la visualizzazione dal controllore? Come questo:

var view = CustomKeyboard.keyboard() 
self.view.addSubview(view) 
+0

In questo modo: 'textField.inputView = CustomKeyboard.keyboard()' È importante. – Sk0prion

+0

Non hai inserito il tuo codice e se usi 'var view = CustomKeyboard();' allora il risultato sarà nel tuo caso: i tuoi punti vendita stanno diventando nulli. Questo è il motivo per cui ho chiesto. – szpetip

1

tuo pennino potrebbe non essere collegata. La mia soluzione è abbastanza semplice. Da qualche parte nel tuo progetto (creo una classe chiamata UIViewExtension.swift), aggiungi un'estensione di UIView con questo pratico metodo connectNibUI.

extension UIView { 
    func connectNibUI() { 
     let nib = UINib(nibName: String(describing: type(of: self)), bundle: nil).instantiate(withOwner: self, options: nil) 
     let nibView = nib.first as! UIView 
     nibView.translatesAutoresizingMaskIntoConstraints = false 

     self.addSubview(nibView) 
     //I am using SnapKit cocoapod for this method, to update constraints. You can use NSLayoutConstraints if you prefer. 
     nibView.snp.makeConstraints { (make) -> Void in 
      make.edges.equalTo(self) 
     } 
    } 
} 

Ora è possibile chiamare questo metodo in ogni caso, nel metodo init, fare questo:

override init(frame: CGRect) { 
    super.init(frame: frame) 
    connectNibUI() 
} 
+0

Assicurati anche che la tua vista sia connessa tramite "File Owner". –