iosswiftuiviewawakefromnib

On awakeFromNib() - Error Instance member 'button' cannot be used on type 'CustomView'


I've created a custom UIView as a .xib file with the UIView having a single button. I load the UIView using the below code.

struct ContentView: View {
    var body: some View {
        CustomViewRepresentable()
    }
}

struct CustomViewRepresentable: UIViewRepresentable {
    typealias UIViewType = CustomView

    func makeUIView(context: UIViewRepresentableContext<CustomViewRepresentable>) -> CustomView {
        let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)![0] as! CustomView
        return customView
    }

    func updateUIView(_ uiView: CustomView, context: UIViewRepresentableContext<CustomViewRepresentable>) {
    }
}

The custom view has the below code:

class CustomView: UIView {

    @IBOutlet weak var button: UIButton!

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

    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    override class func awakeFromNib() {
        super.awakeFromNib()
        // Error - Instance member 'button' cannot be used on type 'CustomView'
        button.addTarget(self, action: #selector(touchUpInside), for: .touchUpInside)
    }

    @objc func touchUpInside(_ sender: UIButton) {
        print("Button clicked")
    }
}

I've uploaded the source code to github. Here's the link https://github.com/felixmariaa/AwakeFromNibTest/

This is supposed to work and I'm not sure what is going wrong.


Solution

  • When typing awakeFromNib, I used the autocomplete provided by XCode to complete the function, which resulted in the below code:

    override class func awakeFromNib() {
    } 
    

    Notice the class in the func declaration. This was causing the error: I removed it and the code worked fine. Thought this would help someone.