我需要在桌面视图中对JSON数据进行排序/分组。
目前,JSON数据无法轻易更改,因此需要在Swift中重新排序。
基本上,我希望计算有多少不同的DATES(这只是一个字符串值)并根据它对数据进行排序。然后,这些部分应该是与行中受尊重的文章不同的DATES。
tableview应如下所示:
**January 1, 2016**
- Article A
- Title
- Author
- ETC...
- Article C
- Title
- Author
- ETC...
**February 2, 2016**
- Article B
- Title
- Author
- ETC...
现在JSON看起来像:
[
{
“x_author”: "",
"excerpt" :
"rendered": “”
},
"x_featured_media" : "",
"title": {
"rendered": “A”
},
"x_date": “January 1, 2016",
},
{
“x_author”: "",
"excerpt" :
"rendered": “”
},
"x_featured_media" : "",
"title": {
"rendered": “B”
},
"x_date": “February 1, 2016",
},
{
“x_author”: "",
"excerpt" :
"rendered": “”
},
"x_featured_media" : "",
"title": {
"rendered": “C”
},
"x_date": “January 1, 2016",
},
]
ViewController如下所示:
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var tableview: UITableView!
var articles: [Article]? = []
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
fetchArticles()
}
func fetchArticles() {
let urlRequest = URLRequest(url: URL(string: "SITE")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
if error != nil {
print(error)
return
}
self.articles = [Article]()
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? AnyObject
if let articlesFromJson = json as? [[String : AnyObject ]] {
for articleFromJson in articlesFromJson {
let article = Article()
if let title = articleFromJson["title"]?["rendered"] as? String,
let author = articleFromJson["x_author"] as? String,
let desc = articleFromJson["excerpt"]?["rendered"] as? String,
let url = articleFromJson["link"] as? String,
let urlToImage = articleFromJson["x_featured_media"] as? String,
let date = articleFromJson["x_date"] as? String {
article.author = author
article.desc = desc
article.headline = title
article.url = url
article.imageUrl = urlToImage
article.date = date
}
self.articles?.append(article)
}
}
DispatchQueue.main.async {
self.tableview.reloadData()
}
} catch let error {
print(error)
}
}
task.resume()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "articleCell", for: indexPath) as! articleCell
cell.title.text = self.articles?[indexPath.item].headline
cell.desc.text = self.articles?[indexPath.item].desc
cell.author.text = self.articles?[indexPath.item].author
cell.date.text = self.articles?[indexPath.item].date
cell.imgView.downloadImage(from: (self.articles?[indexPath.item].imageUrl!)!)
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.articles?.count ?? 0
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let webVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "web") as! WebviewViewController
webVC.url = self.articles?[indexPath.item].url
self.present(webVC, animated: true, completion: nil)
}
}
文章类如下:
import UIKit
class Article: NSObject {
var headline: String?
var desc: String?
var author: String?
var url: String?
var content: String?
var imageUrl: String?
var date: String?
}
我该怎么做呢?
编辑1:
遵循dmorrow的建议,视图控制器现在看起来像这样:
struct Issue {
let dateName: String?
var articles: [Article]?
}
struct Article {
var headline: String?
var desc: String?
var author: String?
var url: String?
var imageUrl: String?
var date: String?
}
var groupedArticles = [Issue]()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
fetchArticles()
}
func fetchArticles() {
let urlRequest = URLRequest(url: URL(string: "SITE")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
if error != nil {
print(error)
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? AnyObject
if let articlesFromJson = json as? [[String : AnyObject ]] {
for articleFromJson in articlesFromJson {
self.groupedArticles.append(Issue(dateName: (articleFromJson["x_date"] as! String), articles: [Article(headline: (articleFromJson["title"] as! String), desc: (articleFromJson["excerpt"] as! String), author: (articleFromJson["x_author"] as! String), url: (articleFromJson["x_featured_media"] as! String), imageUrl: (articleFromJson["x_featured_media"] as! String), date: (articleFromJson["x_date"] as! String))]))
}
}
DispatchQueue.main.async {
self.tableview.reloadData()
}
} catch let error {
print(error)
}
}
task.resume()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "articleCell", for: indexPath) as! articleCell
cell.title.text = self.groupedArticles[indexPath.section].articles?[indexPath.row].headline
cell.desc.text = self.groupedArticles[indexPath.section].articles?[indexPath.row].desc
cell.author.text = self.groupedArticles[indexPath.section].articles?[indexPath.row].author
cell.date.text = self.groupedArticles[indexPath.section].articles?[indexPath.row].date
cell.imgView.downloadImage(from: (self.groupedArticles[indexPath.section].articles?[indexPath.row].imageUrl!)!)
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return groupedArticles.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return groupedArticles[section].articles?.count ?? 0
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let webVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "web") as! WebviewViewController
webVC.url = self.groupedArticles[indexPath.section].articles?[indexPath.row].url
self.present(webVC, animated: true, completion: nil)
}
但是,收到错误:
self.groupedArticles.append(Issue(dateName:(articleFromJson [" x_date"] 如!字符串),文章:[文章(标题:(articleFromJson [" title"] 如!字符串),desc :( articleFromJson [" excerpt"] as!String),作者: (articleFromJson [" x_author"] as!String),url: (articleFromJson [" x_featured_media"] as!String),imageUrl: (articleFromJson [" x_featured_media"] as!String),date: (articleFromJson [" x_date"] as!String))]))
"无法转换类型' __ NSDictionaryM' (0x106a35260)到' NSString' (0x1031d9c40)"
这是正确的轨道吗?我该如何解决这个问题?
更新了fetchArticles函数:
func fetchArticles() {
let urlRequest = URLRequest(url: URL(string: "X")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
if error != nil {
print(error)
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? AnyObject
if let articlesFromJson = json as? [[String : AnyObject]] {
for articleFromJson in articlesFromJson {
// Get All Articles
var articleEntries = [Issue]()
articleEntries.append(Issue(dateName: (articleFromJson["x_date"] as! String), articles: [Article(headline: (articleFromJson["title"]?["rendered"] as! String), desc: (articleFromJson["excerpt"]?["rendered"] as! String), author: (articleFromJson["x_author"] as! String), url: (articleFromJson["x_featured_media"] as! String), imageUrl: (articleFromJson["x_featured_media"] as! String), date: (articleFromJson["x_date"] as! String))]))
// SORT Articles by KEY of X_Date(String)
var groupedArts = [String: [Issue]]()
var groupedKeys = Array<String>()
for article in articleEntries {
let index = (article.dateName?.startIndex)!..<(article.dateName?.endIndex)!
let keys = String(describing: article.dateName?[index])
if groupedArts[keys] != nil {
groupedArts[keys]?.append(article)
print("this array exists")
} else {
groupedArts[keys] = [article]
groupedKeys.append(keys)
print("this array does not exist")
}
}
print(groupedArts)
print(groupedKeys)
}
}
DispatchQueue.main.async {
self.tableview.reloadData()
}
} catch let error {
print(error)
}
}
task.resume()
}
根据我的理解,我应该解析这些条目,然后使用类似于示例代码的内容重新排序它们,但它会单独生成结果:
[&#34;可选(\&#34; 2016年2月14日\&#34;)&#34;: [Journal.ViewController.Issue(dateName:Optional(&#34; 2016年2月14日和#34;), 文章:可选([Journal.ViewController.Article(标题: 可选(&#34;案例档案:严重缺氧引起震惊&#34;),desc: 可选(&#34; ABC&#34;),作者: 可选(&#34; AUTHOR&#34;),url:可选(&#34; X&#34;),imageUrl:可选(&#34; X&#34;),日期: 可选(&#34; 2016年2月14日&#34;))]))]] [&#34;可选(\&#34; 2月14日, 2016 \&#34;)&#34;]
等每篇文章。我试图解析IF语句中的文章但是崩溃了。我该怎么办?
答案 0 :(得分:1)
通常,您需要为数据源创建一个Section
数组。
struct Section {
let date:Date
var articles:[Article]
}
var groupedArticles = [Section]()
在将JSON解析为Article
时,您应该将它们存储在此数组中。 Article
应该是一个结构,你应该调查https://github.com/Hearst-DD/ObjectMapper或https://github.com/SwiftyJSON/SwiftyJSON
然后你可以使用这些方法
func numberOfSections(in tableView: UITableView) -> Int {
return groupedArticles.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return groupedArticles[section].articles.count ?? 0
}