2015-02-07 84 views
12

IBOutlets發生了一些奇怪的事情。 enter image description hereIBOutlet屬性在從xib加載的自定義視圖後無n

在代碼中,我嘗試訪問此屬性,但它們是nil。代碼:

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

你在哪裏訪問它們除了commonInit? – 2015-02-07 17:34:27

+0

@AshrafTawfeeq現在無處可去。我不能正常初始化這個類。 乾淨的項目也沒有幫助 – Sk0prion 2015-02-07 18:17:11

+0

在初始化時,Outlet尚未設置,因爲視圖尚未加載。您的第二個日誌工作,因爲訪問視圖導致它被加載。 – rdelmar 2015-02-07 18:18:13

回答

27

這是預料之中的,因爲IBOutlet在調用初始化程序時未分配。您不需要commonInit,只需重寫awakeFromNib,如下所示:

override func awakeFromNib() { 
    super.awakeFromNib() 

    print(aButt) 
} 
0

你是如何從控制器發起你的觀點的?像這樣:

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

像這樣:'textField.inputView = CustomKeyboard.keyboard()' 這是最重要的。 – Sk0prion 2015-02-07 18:18:25

+0

你沒有發佈你的代碼,如果你使用'var view = CustomKeyboard();'那麼結果會像你的情況那樣:你的網點正在變爲零。這就是我問的原因。 – szpetip 2015-02-07 18:26:19

1

您的筆尖可能未連接。我的解決方案非常簡單。在你項目的某個地方(我創建了一個名爲UIViewExtension.swift的類),用這個方便的connectNibUI方法添加UIView的擴展。

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) 
     } 
    } 
} 

現在你可以調用這個方法上的任何觀點,在你的init方法,這樣做:

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

還要確保您的視圖通過「文件所有者」進行連接。 – 2016-11-30 23:23:57