Search code examples
swiftprotocolsxib

@IBDesignable with protocol


I have a UIview xib within a view controller, UIview class have two buttons with protocol function, but the protocol function never called when I press button, storyboard image like below

enter image description here

protocol method like below

import UIKit

@objc protocol TopViewDelegate: NSObjectProtocol {
   @objc optional func pressRefreshButton()
   @objc optional func pressMenuButton()
}

UIView class

@IBDesignable class OnJob_Top: UIView,TopViewDelegate {

weak var delegate : TopViewDelegate? = nil

@IBAction func refreshButtonTouchUpInside(_ sender: UIButton) {
    delegate?.pressRefreshButton!()
}
@IBAction func menuButtonTouchUpInside(_ sender: UIButton) {
    delegate?.pressMenuButton!()
    print("come come")
}

view controller class

class HomeViewController: UIViewController {

   override func viewDidLoad() {
       super.viewDidLoad()
       let topView = OnJob_Top()
       topView.delegate = self
   }
}
extension HomeViewController:TopViewDelegate {

   func pressMenuButton() {
       print("come") // never come here
   }

   func pressRefreshButton() {
       print("come") // never come here
   }
}

Solution

  • Consider this code:

       let topView = OnJob_Top()
       topView.delegate = self
    

    In the first line, you create a completely new OnJob_Top view.

    In the second line, you make it the delegate.

    In the third line... but there is no third line. The view vanishes in a silent puff of smoke. It is useless.

    Meanwhile, the view in the storyboard never gets a delegate. So its delegate methods are never called.