如何将 table 视图的刷新控制实现为常用功能
How to implement refresh control for table views as common function
我有很多 VC 我在其中 Table 添加了刷新控件的视图。这是每个 VC 中的复制粘贴。我想将刷新控件移动到扩展中的一个通用功能,但我不知道该怎么做。如果还有其他方法可以避免复制粘贴,请给我一些指示。
以下是我在 VC.swift
中的典型刷新控制实现
class MyVC: UIViewController {
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControlEvents.valueChanged)
return refreshControl
}()
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 10.0, *) {
messagesTable.refreshControl = refreshControl
} else {
messagesTable.addSubview(refreshControl)
}
}
@objc func refresh(_ refreshControl: UIRefreshControl) {
fetchData()
}
}
如果您的所有 ViewController 内部都应该有 TableView 和 RefreshControl,您可以为所有这些控制器创建一个超类(您可以保留 MyVC
)。
class MyVC: UIViewController {
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControlEvents.valueChanged)
return refreshControl
}()
func addRefreshControl(to tableView: UITableView) {
if #available(iOS 10.0, *) {
tableView.refreshControl = refreshControl
} else {
tableView.addSubview(refreshControl)
}
}
@objc func refresh(_ refreshControl: UIRefreshControl) {
fetchData()
}
func fetchData() {
}
}
然后将您的其他控制器设为 MyVC
的子类,当您需要添加 RefreshControl 时,调用 addRefreshControl
并将控制器的 TableView 作为参数
class MessageVC: MyVC {
@IBOutlet weak var messageTable: UITableView!
...
override func viewDidLoad() {
super.viewDidLoad()
...
addRefreshControll(to: messageTable)
}
...
override func fetchData() {
// what should happen when refresh control changes its value
}
}
...您也可以覆盖 fetchData
方法并声明当刷新控件更改其值时应该发生什么
我有很多 VC 我在其中 Table 添加了刷新控件的视图。这是每个 VC 中的复制粘贴。我想将刷新控件移动到扩展中的一个通用功能,但我不知道该怎么做。如果还有其他方法可以避免复制粘贴,请给我一些指示。
以下是我在 VC.swift
中的典型刷新控制实现class MyVC: UIViewController {
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControlEvents.valueChanged)
return refreshControl
}()
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 10.0, *) {
messagesTable.refreshControl = refreshControl
} else {
messagesTable.addSubview(refreshControl)
}
}
@objc func refresh(_ refreshControl: UIRefreshControl) {
fetchData()
}
}
如果您的所有 ViewController 内部都应该有 TableView 和 RefreshControl,您可以为所有这些控制器创建一个超类(您可以保留 MyVC
)。
class MyVC: UIViewController {
lazy var refreshControl: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(refresh(_:)), for: UIControlEvents.valueChanged)
return refreshControl
}()
func addRefreshControl(to tableView: UITableView) {
if #available(iOS 10.0, *) {
tableView.refreshControl = refreshControl
} else {
tableView.addSubview(refreshControl)
}
}
@objc func refresh(_ refreshControl: UIRefreshControl) {
fetchData()
}
func fetchData() {
}
}
然后将您的其他控制器设为 MyVC
的子类,当您需要添加 RefreshControl 时,调用 addRefreshControl
并将控制器的 TableView 作为参数
class MessageVC: MyVC {
@IBOutlet weak var messageTable: UITableView!
...
override func viewDidLoad() {
super.viewDidLoad()
...
addRefreshControll(to: messageTable)
}
...
override func fetchData() {
// what should happen when refresh control changes its value
}
}
...您也可以覆盖 fetchData
方法并声明当刷新控件更改其值时应该发生什么