单击XIB按钮时刷新当前视图控制器数据请求

Posted

技术标签:

【中文标题】单击XIB按钮时刷新当前视图控制器数据请求【英文标题】:Refresh Current View Controller Data Request when XIB Button Clicked 【发布时间】: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 来实现。 【参考方案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

以上是关于单击XIB按钮时刷新当前视图控制器数据请求的主要内容,如果未能解决你的问题,请参考以下文章

单击按钮时刷新片段视图

为什么我的ajax请求从Laravel控制器重复相同的数据?

单击按钮导航到根视图控制器

如何实现 .xib 文件按钮操作? [关闭]

iOS - 使用 xib 中的 tabBarController 将数据从一个 viewController 传递到另一个 viewController

Spring 跨重定向请求传递数据