2015-02-07 12 views
12

Điều gì đó kỳ lạ xảy ra với IBOutlets. enter image description hereThuộc tính IBOutlet không sau khi xem tùy chỉnh được tải từ xib

Trong mã Tôi đã cố gắng truy cập vào các thuộc tính này, nhưng chúng là nil. Mã số:

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

đâu bạn truy cập vào chúng bên cạnh commonInit? –

+0

@AshrafTawfeeq hiện không có nơi nào. Tôi không thể bình thường init lớp này. Ngoài ra dự án sạch sẽ không giúp được – Sk0prion

+0

Các cửa hàng chưa được đặt tại thời điểm init vì chế độ xem chưa được tải. Nhật ký thứ hai của bạn hoạt động vì việc truy cập chế độ xem làm cho nó được tải. – rdelmar

Trả lời

27

Dự kiến, vì IBOutlet (s) không được chỉ định bởi thời gian khởi tạo được gọi. Bạn không cần commonInit, chỉ cần ghi đè awakeFromNib như sau:

override func awakeFromNib() { 
    super.awakeFromNib() 

    print(aButt) 
} 
0

Và cách bạn bắt đầu chế độ xem của mình từ bộ điều khiển? Như thế này:

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

Như sau: 'textField.inputView = CustomKeyboard.keyboard()' Đó là vấn đề đáng lo ngại nhất. – Sk0prion

+0

Bạn không đăng mã của bạn và nếu bạn sử dụng 'var view = CustomKeyboard();' thì kết quả sẽ giống như trong trường hợp của bạn: các cửa hàng của bạn đang nhận được không. Đây là lý do tôi hỏi. – szpetip

1

Nib của bạn có thể không được kết nối. Giải pháp của tôi khá đơn giản. Một nơi nào đó trong dự án của bạn (tôi tạo ra một lớp gọi là UIViewExtension.swift), thêm một phần mở rộng của UIView với phương pháp connectNibUI tiện dụng này.

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

Bây giờ bạn có thể gọi phương pháp này trên bất kỳ quan điểm, trong phương pháp init của bạn, làm điều này:

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

Đồng thời đảm bảo chế độ xem của bạn được kết nối qua "Chủ sở hữu tệp". –

Các vấn đề liên quan