swift - 如何在 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
}
}
}
}
解决方案
cellForRowAt
table-view 委托函数应该只用于获取完成的数据并将其注入到单元格中——就是这样。除了将数据注入单元格之外,您不应在其中实例化日期格式化程序之类的东西(极少数例外)。
当您从网络管理器获取数据并且网络管理器返回数据时,请在其中进行所有解析。例如,这是您应该使用日期格式化程序的地方。解析完所有数据后,按日期对数组进行排序,然后调用tableView.reloadData()
. 这里的关键是数组的顺序决定了表格视图中单元格的顺序。
推荐阅读
- c - 在代码 C 执行后检索全局变量内容的历史记录
- php - PHP:图像名称的正则表达式 JSON 文件
- android - 如何在不点击关闭按钮的情况下关闭全屏广告?
- css - ul li 文本与复选框垂直对齐不完美
- python - 垂直合并数据框
- python - 如何从数组中删除特定元素而不删除其以后出现的元素
- c# - 如何在 ASP.Net Core Razor 页面中组织多语言 URL?
- python-2.7 - 如何修复python2.7中的“AttributeError:'module'对象没有属性'storage'”错误
- android - 如何从 Android 手机向 Pi 发送 NDEF 消息
- angular - 如何监视茉莉花中使用 require() 带来的东西?或“从'place'导入*作为foo”