XIB 和视图控制器之间的协议委托

Posted

技术标签:

【中文标题】XIB 和视图控制器之间的协议委托【英文标题】:Protocol Delegate between XIB and View Controller 【发布时间】:2019-04-18 11:59:57 【问题描述】:

所以我有 XIB 视图和视图控制器。我想要当我的 XIB 中的一个按钮单击(didTapTryAgain 按钮)时,从我的视图控制器调用一个函数。然后我尝试为该类创建一个协议和委托。但它仍然不会调用我的函数。这是我的 XIB 视图类:

import UIKit

protocol ErrorMessageDelegate 
    func refresh(_sender: AnyObject)


class ErrorMessage: UIView 
    @IBOutlet weak var imageViewError: UIImageView!
    @IBOutlet weak var labelError: UILabel!
    @IBOutlet weak var buttonTryAgain: UIButton!
    static weak var shared: ErrorMessage?
    var delegate: ErrorMessageDelegate?
    static var message: String?

    override func awakeFromNib() 
        ErrorMessage.shared = self
        labelError.text = ErrorMessage.message
    

    @IBAction func didTapTryAgain(_ sender: UIButton) 
        delegate?.refresh(_sender: buttonTryAgain)
    

这是我的视图控制器类:

import Foundation

class BaseViewController: UIViewController, ErrorMessageDelegate 

    func refresh(_sender: AnyObject) 
        print("I hope my function work here")
    

    var uiView =  UIView();

    override func viewDidLoad() 
        super.viewDidLoad()
        ErrorMessage.shared?.delegate = self
    

    func getErrorMessage(message:String) 
        super.viewDidLoad()
        Dialog.dismiss()
        ErrorMessage.message = message
        guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else  return
        self.view.addSubview(viewErrorMessage)
    

我正在关注 this answer 获取我的代码,但它仍然无法正常工作。有人知道该怎么做吗?谢谢!

【问题讨论】:

【参考方案1】:

您的问题是您在此处为共享实例设置了委托

ErrorMessage.shared?.delegate = self / here shared?. is nil

但是在这里

guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else  return
self.view.addSubview(viewErrorMessage)

你创建一个单独的实例并添加它

你需要

var viewErrorMessage:ErrorMessage! // add to the vc

viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as! ErrorMessage 
viewErrorMessage.delegate = self
self.view.addSubview(viewErrorMessage)

也彻底摆脱了

static weak var shared: ErrorMessage?

【讨论】:

【参考方案2】:

只需使用此代码,您的委托方法就会被调用。

  func getErrorMessage(message:String) 
    ErrorMessage.message = message
    guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else  return
    viewErrorMessage.delegate = self
    self.view.addSubview(viewErrorMessage)

并在您想要打开弹出窗口的任何地方调用方法

getErrorMessage(message: "Test Message")

【讨论】:

以上是关于XIB 和视图控制器之间的协议委托的主要内容,如果未能解决你的问题,请参考以下文章

Swift:我的委托协议方法需要在另一个视图控制器上执行

如何从 xib 文件加载视图控制器?

弱委托和 .xib 文件

Xib 文件 UITableViewCell 出口为零

应用程序委托和视图控制器之间的 NSUserDefaults

视图控制器和 UIView 之间的简单委托不起作用