我想知道如果在表视图控制器中有几篇文章是如何工作的,这些文章是从某些API加载和解析的。然后,我想单击一些文章以查看他的详细信息。
我应该在启动所有数据时加载所有文章,然后将具体的整个文章传递给下一个明细表控制器,还是仅发送文章ID,然后在新的表格控制器中再次加载具有传递ID的整个文章?
我认为这是更好的第二种方法,但不知道如何去做。有什么帮助吗?非常感谢。
编辑:添加代码
MainTableViewController:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let articleId = articles[indexPath.row].Id
let destination = DetailTableViewController()
destination.articleId = articleId
destination.performSegue(withIdentifier: "Main", sender: self)
}
DetailTableViewController:
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140
// Vyzkoušíme jestli jsme připojeni do internetu
if Helper.hasConnectivity() {
// Zapneme načítací obrazovku
setLoadingScreen()
// Načteme jídla
loadMainArticles()
} else {
promptAlert(title: "Upozornění", message: "Ujistěte se, že Vaše zařízení je připojené k internetu")
}
}
private func loadMainArticles() {
ApiService.sharedInstance.fetchArticle(part: "GetArticle", articleId: "brananske-posviceni--spravna-lidova-zabava-s-pecenou-husou") { (articles: [Article]) in
self.removeLoadingScreen()
self.tableView.separatorStyle = .singleLine
if articles.count == 0 {
self.promptAlert(title: "Upozornění", message: "Žádná data")
}
self.selectedArticle = articles[0]
self.tableView.reloadData()
}
}
ApiService:
func fetchArticle(part: String, articleId: String, completion: @escaping ([Article]) -> ()) {
var Id = ""
var Title = ""
var Content = ""
var Picture = ""
var PublishDate = ""
let url = NSURL(string: "http://xxx")
URLSession.shared.dataTask(with: url! as URL) { (data, response, error) in
if error != nil {
print(error as Any)
return
}
do {
let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments)
var articles = [Article]()
for dictionary in json as! [[String: AnyObject]] {
.
.
.
let article = Article(Id: Id, Title: Title, Content: Content, Picture: Picture, PublishDate: PublishDate, Categories: Categories)
articles.append(article!)
}
DispatchQueue.main.async(execute: {
completion(articles)
})
}
}.resume()
}
问题是,当我在单击行之后执行segue时,则应该加载MainArticles。该方法被触发,但始终在URLSession行上停止,并立即跳转到resume(),并且永远不会触发完成块。有什么原因吗?
这是应根据商品数据模型大小进行的选择。
您应注意需要在TableView单个单元上显示哪些数据以及在“文章详细信息”页面上显示哪些数据。
我想你显示:
在这种情况下,我建议您仅下载每个商品的标题和小时,然后在详细信息页面中下载单个商品的详细信息(避免下载未使用的内容,因为用户无法打开每个商品)。
否则,如果数据量相似,则在不发出任何其他网络请求的情况下,在首次连接上下载所有信息并打开详细信息页面。
我认为这是更好的第二种方法,但不知道如何去做。
您需要从TableView选定的单元格中检索商品ID,然后使用prepareForSegue将其传递给DetailPageViewController。在DetailPageViewController ViewDidLoad中,将文章ID发送到您的后端api,并检索要显示的文章详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句