swift - 如何在 UITableView 中更新 RSS 数据?
问题描述
我有什么:这个项目,写在 SWIFT5 上,它是一个 rss 阅读器(我使用标准 XMLParser )。我用解析器中的数据填充单元格。为了更新单元格中的数据,我实现了 UIRefreshControl 并编写了 objc 方法,该方法包含与我用来获取数据的相同方法(fetchData - 见代码),但它不起作用。此外,此方法仅在启动应用程序时调用一次。当我关闭应用程序然后打开时,数据没有更新......我该如何处理?
我想要什么: 当 refreshControl 被激活时,单元格中的数据应该被更新
我做了什么:我声明了一个名为refreshControl的变量,将其添加到tableView并编写了一个与控件相关的方法#refresh
import UIKit
class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var table: UITableView!
private let url = "my url"
private var rssItems: [RSSItem]? {
didSet {
DispatchQueue.main.async {
self.table.reloadData()
}
}
}
var refreshControl = UIRefreshControl()
@objc func refresh (sender: UIRefreshControl) {
fetchData()
sender.endRefreshing()
}
override func viewDidLoad() {
super.viewDidLoad()
refreshControl.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)
self.table.refreshControl = refreshControl
table.addSubview(refreshControl)
fetchData()
}
private func fetchData() {
let feedParser = FeedParser()
feedParser.parseFeed(url: url) { (rssItems) in
self.rssItems = rssItems
DispatchQueue.main.async {
self.table.reloadData()
}
}
}
解决方案
获取数据并设置或添加刷新控制后结束刷新
@objc func refresh (sender: UIRefreshControl) {
fetchData()
}
override func viewDidLoad() {
super.viewDidLoad()
refreshControl.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)
self.table.refreshControl = refreshControl
// table.addSubview(refreshControl)
fetchData()
}
private func fetchData() {
let feedParser = FeedParser()
feedParser.parseFeed(url: url) { (rssItems) in
self.rssItems = rssItems // as you are reloading table here
DispatchQueue.main.async {
refreshControl.endRefreshing()
// self.table.reloadData()
}
}
}
推荐阅读
- java - Apache Flink 1.14.0 - 提交作业时出错
- python - 分箱如何在 pandas 数据框中工作,如何根据 Python 中的百分位数对数据集进行分类?
- c# - 如何在 EF Core 上通过 Fluent Api 创建 EncryptColumn
- html - 为什么我不能将我的三个 div 放在一行中?
- python - 用比较符号简化布尔表达式
- java - InvalidPropertyException:bean 类的无效属性“customer [id]”
- python - Python Multiprocesssing:当我向 ProcessPoolExecutor 提交对象列表时,提交的是副本还是参考?
- kdb - 如何用另一个数字替换列表中的“x”?
- python - 为什么类属性中的列表实例化后还是类属性,而不是实例属性?
- compatibility - 需要将 SoapAPI 转移到 RestAPI,有什么可用的吗?它是什么样子的?