首页 > 解决方案 > 如何在 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()
            }
        }

    }

标签: swiftrssnsxmlparser

解决方案


获取数据并设置或添加刷新控制后结束刷新

@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()
        }
    }
}

推荐阅读