如何使用 swift 中的委托通知 UIViewController 在 xib 文件中单击了按钮?

how to notify a UIViewController that a button was clicked in a xib file using a delegate in swift?

我有点卡住了。 我有一个 UIViewController 和一个扩展 UIView 的自定义 pop.xibpop.xib 连接到 pop.swift。 在 UIViewController 中,一个按钮使 .xib 文件弹出。

并且在 pop.xib 中有一个按钮,单击该按钮可将一些数据发送到数据库。

但是当在 pop.xib 中单击该按钮发送数据时,我希望 UIViewController

a) 知道何时单击 @IBAction func sendDataToDbAction(_ sender: Any)

b) 当 sendDataToDbAction 内部的 if 语句 returns 为假时,则在 UIViewController

上显示警报
//pop.swift

     class Pop: UIView {

            @IBOutlet var delegate: AnswerDelegate?

            @IBAction func sendDataToDbAction(_ sender: Any)
            {
                     if(answer == false)
                     {
                          don't send to db
                          alert pops up saying answer is false
                     }
                     else
                     {

                     }

            }
         }

我已经在 pop.swift

中设置了一个委托
//pop.swift

@objc protocol AnswerDelegate {

    func isCorrectAnswer()
}



//UIViewController

extension UIViewController:AnswerDelegate{

//set the pop.xib delegate to self
// implement func isCorrectAnswer

}

我只是不确定如何使用委托来做我想做的事。

谢谢。

看看这个,你可以这样做。

Pop.swift

@objc protocol AnswerDelegate {
    func isCorrectAnswer()
}

class Pop: UIView {

    var answerDelegate: AnswerDelegate?

    class func instanceFromNib() -> Pop {
        return UINib(nibName: "Pop", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! Pop
    }

    @IBAction func sendDataToDbAction(_ sender: Any)
    {
        if(answer == false) {
            //Alert
        }
        else {
            answerDelegate?.isCorrectAnswer()
        }
    }
}

控制器:

class ViewController: UIViewController, AnswerDelegate {

    func isCorrectAnswer() {

    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let popView = Pop.instanceFromNib()
        popView.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        popView.answerDelegate = self

        self.view.addSubview(popView)
    }
}

我不太确定您可以在扩展上执行此操作,因为您需要在视图控制器中的某个位置设置委托。

调整你的pop.swift调用委托函数如下:

@IBAction func sendDataToDbAction(_ sender: Any) {
  if(answer == false) {
    // show alert
  } else {
    delegate?.isCorrectAnswer()
  }
}

在您的视图控制器中,设置委托并添加如下函数:

class MyViewController: UIViewController, AnswerDelegate {

  override func viewDidLoad() {
    super.viewDidLoad()
    pop.delegate = self
  }

  func isCorrectAnswer() {
  }
}

首先您需要创建两个 类 一个是 UIViewController,一个是 XIB,如下所示。并添加一个协议及其委托函数。重写 viewController 中的委托方法以获得结果。

LoginVC.swift

import UIKit

class LoginVC: UIViewController, UITextFieldDelegate, RegisterViewDelegate {

    func shiftRegisterViewUpDelegateFunction() {
        if isRegister {
            UIView.animate(withDuration: 1.1, delay: 0, options: .curveEaseIn, animations: {
                self.registerView.transform = CGAffineTransform(translationX: 0, y: 0)
                self.loginView.transform = CGAffineTransform(translationX: 0, y: 0)
            })
            isRegister = false
        } else {
            UIView.animate(withDuration: 1.1, delay: 0, options: .curveEaseIn, animations: {
                var yaxis = CGFloat()
                if GlobalConstants.kIphone_5 {
                    yaxis = -(1.0*self.loginView.frame.size.height)+150
                } else {
                    yaxis =  -(1.0*self.loginView.frame.size.height)+170
                }
                self.registerView.transform = CGAffineTransform(translationX: 0, y: yaxis)
                self.loginView.transform = CGAffineTransform(translationX: 0, y: yaxis)
            })
            isRegister = true
        }
    }


    override func viewDidLoad() {
        super.viewDidLoad()
        //Adding subviews
        self.addSubviewsOverMainView()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
    }

    func addSubviewsOverMainView() {


        registerView = Bundle.main.loadNibNamed("RegisterView", owner: self, options: nil)?[0] as! RegisterView
        if GlobalConstants.kIphone_5 {
            registerView.frame = CGRect(x: 0, y: self.view.frame.size.height-150, width: self.view.frame.size.width, height: self.view.frame.size.height)
        }else {
            registerView.frame = CGRect(x: 0, y: self.view.frame.size.height-150, width: self.view.frame.size.width, height: self.view.frame.size.height)
        }
        registerView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        self.view.addSubview(registerView)
        registerView.delegate = self
    }

}

RegisterXIB.swift

import UIKit

protocol RegisterViewDelegate {
    func shiftRegisterViewUpDelegateFunction()
}

class RegisterView: UIView, UIScrollViewDelegate {

    var delegate: RegisterViewDelegate?
    var isRotated = Bool()
    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var formView: UIView!
    @IBOutlet weak var shiftUpBtn: UIButton!

    override func awakeFromNib() {
        super.awakeFromNib()
        let scrollview = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.containerView.frame.size.width, height: self.containerView.frame.size.height))
        scrollview.delegate = self
        scrollview.contentSize = CGSize(width: self.containerView.frame.size.width, height: 500)
        scrollview.showsVerticalScrollIndicator = true
        scrollview.isScrollEnabled = true
        scrollview.isUserInteractionEnabled = true
        scrollview.backgroundColor = UIColor.clear
        scrollview.addSubview(formView)
        containerView.addSubview(scrollview)
    }

    @IBAction func shiftRegistrationUpAction(_ sender: Any) {
        if isRotated {
            UIView.animate(withDuration: 1.2) {
                self.isRotated = false
                self.shiftUpBtn.transform = .identity
            }
        } else {
            UIView.animate(withDuration: 1.2) {
                self.isRotated = true
                self.shiftUpBtn.transform = CGAffineTransform(rotationAngle: .pi)
            }
        }
        self.delegate?.shiftRegisterViewUpDelegateFunction()
    }
}