首页 > 解决方案 > 如何在 Swift 中按日期对 UITableView 中的单元格进行排序

问题描述

我想按文章的发布日期升序对单元格进行排序。我按日期数组排序,但我现在真的不知道下一步该做什么。据我了解,我需要在 cellforRow 函数中执行此操作。好吧,我只是卡住了。帮助将不胜感激。

ps 我从一个新闻 api 获取信息,如果您需要更多代码,请告诉我

导入 UIKit 导入 WebKit

class WelcomeScreen: UITableViewController, NetworkManagerDelegate, WKNavigationDelegate {

    
    var networkManager = NetworkManager()
    var posts = [Article]()
    


    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.tableView.register(UINib(nibName: "ArticleViewCell", bundle: nil), forCellReuseIdentifier: "customCell")
        tableView.rowHeight = 130.0
        networkManager.delegate = self
        networkManager.fetchNews("us")
    
        
    }
    
    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return posts.count
    }

 
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! ArticleViewCell
        
               
        let post = posts[indexPath.row]
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
        
        
        cell.author.text = post.author ?? "N/A"
        cell.title.text = post.articleDescription
        cell.timePosted.text = dateFormatter.string(from: post.publishedAt)
        
        if let image = post.urlToImage{
        cell.imageForArticle.load(url: image)
        }
        let arrayOfDates = [post.publishedAt]
        
        let sortedDates = arrayOfDates.sorted(by: { $0.compare($1) == .orderedAscending })
        
        print(sortedDates)
        
    
        return cell
        
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let url = posts[indexPath.row].url else{
            fatalError()
        }
        let webVC = WebViewController(url: url, title: posts[indexPath.row].title)
        let navVC = UINavigationController(rootViewController: webVC)
        navVC.modalPresentationStyle = .fullScreen
        present(navVC, animated: true)
 

        }


    func didUpdateNews(root: Root) {
        posts = root.articles
        DispatchQueue.main.async {
            self.tableView.reloadData()

        }
        
    }

}

extension UIImageView {
    func load(url: URL) {
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url) {
                if let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.image = image
                    }
                }
            }
        }
    }
}

网络管理员

import Foundation

协议 NetworkManagerDelegate{ func didUpdateNews(root: Root) } struct NetworkManager{ var delegate: NetworkManagerDelegate?

func fetchNews(_ countryCode: String) {
    var urlComponents = URLComponents()
    urlComponents.scheme = "https"
    urlComponents.host = "newsapi.org"
    urlComponents.path = "/v2/top-headlines"
    urlComponents.queryItems = [.init(name: "apiKey", value: "a16b15f863454928804e218705d0f019"),
                                .init(name:"country", value: countryCode)]
    
    if let url = urlComponents.url {
        performRequest(url)
    }
}

func performRequest(_ url: URL) {
    URLSession.shared.dataTask(with: url) { data, response, error in
        if error != nil{
            return
            
        }
        
        if let safedata = data {
            if let root = parseJson(data: safedata){
                delegate?.didUpdateNews(root: root)
            }
        }
        
        }.resume()
        
        
        func parseJson(data: Data) -> Root?{
        do {
            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .iso8601
            let root = try decoder.decode(Root.self, from: data)

            
            
            
            return root
            
        }catch{
            print(error)
            return nil
}

        }
}

}

标签: swift

解决方案


cellForRowAttable-view 委托函数应该只用于获取完成的数据并将其注入到单元格中——就是这样。除了将数据注入单元格之外,您不应在其中实例化日期格式化程序之类的东西(极少数例外)。

当您从网络管理器获取数据并且网络管理器返回数据时,请在其中进行所有解析。例如,这是您应该使用日期格式化程序的地方。解析完所有数据后,按日期对数组进行排序,然后调用tableView.reloadData(). 这里的关键是数组的顺序决定了表格视图中单元格的顺序。


推荐阅读