2015-02-07 11 views
12

Coś dziwnego dzieje się z IBOutlets. enter image description hereWłaściwości IBOutlet zero po niestandardowym widoku załadowanym z Xib

W kodzie próbuję uzyskać dostęp do tych właściwości, ale są to nil. Kod:

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

Dokąd dostępu do nich oprócz commonInit? –

+0

@AshrafTawfeeq teraz nigdzie. Nie mogę normalnie inicjować tej klasy. Również czysty projekt nie pomaga – Sk0prion

+0

Gniazda nie są jeszcze ustawione w czasie inicjacji, ponieważ widok nie został załadowany. Drugi dziennik działa, ponieważ dostęp do widoku powoduje jego załadowanie. – rdelmar

Odpowiedz

27

Jest to oczekiwane, ponieważ IBOutlet (s) nie są przypisane do czasu wywołania inicjalizatora. Nie potrzebujesz wtyczki commonInit, tylko przesłonę awakeFromNib w następujący sposób:

override func awakeFromNib() { 
    super.awakeFromNib() 

    print(aButt) 
} 
0

Jak zainicjowałeś swój widok od kontrolera? W ten sposób:

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

W ten sposób: 'textField.inputView = CustomKeyboard.keyboard()' To ma znaczenie. – Sk0prion

+0

Nie opublikowałeś swojego kodu i jeśli użyjesz 'var view = CustomKeyboard() ;, wtedy wynik będzie się podobał w twoim przypadku: twoje punkty zerują się. Oto dlaczego zapytałem. – szpetip

1

Twoja stalówka może nie być podłączona. Moje rozwiązanie jest dość proste. Gdzieś w projekcie (tworzę klasę o nazwie UIViewExtension.swift), dodaj rozszerzenie UIView przy użyciu tej przydatnej metody 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) 
     } 
    } 
} 

Teraz można wywołać tej metody w każdym razie, w swojej metodzie init to zrobić:

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

Upewnij się również, że Twój widok jest połączony z "Właścicielem pliku". –

Powiązane problemy