【问题标题】:Refresh Current View Controller Data Request when XIB Button Clicked单击XIB按钮时刷新当前视图控制器数据请求
【发布时间】:2019-04-15 04:16:22
【问题描述】:

我想通过我的所有视图控制器制作错误处理页面,因此当错误获取数据错误时,它不仅显示对话框,而且显示包含错误消息和刷新按钮的 XIB 文件。像这样:

这是 XIB 类代码:

import UIKit

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

    override func awakeFromNib() {
        labelError.text = ErrorMessage.message
    }

    @IBAction func didTapTryAgain(_ sender: Any) {
        Dialog.showProgressDialog(info: "")
    }
}

这是我处理所有问题的基本控制器代码。

import Foundation

class BaseViewController: UIViewController {

    var uiView =  UIView();

    override func viewDidLoad() {

    }

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

}

这是我在另一个类中调用它的方法,我扩展了BaseViewController,因此它可以全局显示错误问题,而无需我再次重新声明该类:

func onFailedDeleteCart(errorMessage: String) {
        getErrorMessage(message: errorMessage)
    }

现在我可以传递错误消息。

问题是,我希望刷新按钮在单击时刷新当前的视图控制器。也许当我点击它时调用当前视图控制器的 viewDidLoad 将是一个很好的逻辑,但我不知道如何在 XIB 类中实现它。 任何人都可以解决这个问题?谢谢!

【问题讨论】:

  • 您可以使用completion handlerdelegate 来实现。

标签: ios swift xib


【解决方案1】:

方法:1

步骤:1 为回调创建闭包

typealias RefreshBlock = (()->())?

步骤:2 在 UIView 类中定义闭包

步骤:3 如果用户点击刷新按钮,则调用关闭

class ErrorMessage: UIView {
    @IBOutlet weak var imageViewError: UIImageView!
    @IBOutlet weak var labelError: UILabel!
    @IBOutlet weak var buttonTryAgain: UIButton!
    var refreshBlock:RefreshBlock!
    static var message: String?

    override func awakeFromNib() {
        labelError.text = ErrorMessage.message
    }

    // Step : 3
    @IBAction func didTapTryAgain(_ sender: UIButton) {
        refreshBlock!()
    }
}

步骤:4 调用addSubview时在闭包中赋值

class BaseViewController: UIViewController {

    override func viewDidLoad() {
    }

    func getErrorMessage(message:String) {
        super.viewDidLoad()
        ErrorMessage.message = message
        guard let viewErrorMessage = Bundle.main.loadNibNamed("ErrorMessage", owner: self, options: nil)?.first as? ErrorMessage else { return}
        viewErrorMessage.refreshBlock = {()
            self.viewDidLoad()
            print("Refresh Contents")
        }   
        self.view.addSubview(viewErrorMessage)
    }

}

方法:2

将您当前的 UIViewController 引用传递给 UIView 类。参考下面的代码。

class ErrorMessage: UIView {
    @IBOutlet weak var imageViewError: UIImageView!
    @IBOutlet weak var labelError: UILabel!
    @IBOutlet weak var buttonTryAgain: UIButton!
    var currentVC:UIViewController!
    static var message: String?

    override func awakeFromNib() {
        labelError.text = ErrorMessage.message
    }

    @IBAction func didTapTryAgain(_ sender: UIButton) {
        currentVC.viewDidLoad()
    }
}


class BaseViewController: UIViewController {

    override func viewDidLoad() {

    }

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

}

【讨论】:

  • 这很棒。但是,如何从另一个视图控制器访问 viewErrorMessage.refreshBlock = {() print("Refesh contents") }?所以我可以在那里提出要求
  • viewErrorMessage.refreshBlock = {() print("Refesh contents") } 已经在 UIViewController 中了
  • 抱歉,我把 viewErrorMessage.refreshBlock = {() print("Refesh contents") } 放在扩展 UIViewController 的基本控制器上。我想在另一个控制器中访问它,我扩展了我的 BaseController
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
相关资源
最近更新 更多