单击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 handler
或delegate
来实现。
【参考方案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控制器重复相同的数据?
iOS - 使用 xib 中的 tabBarController 将数据从一个 viewController 传递到另一个 viewController