将 Json 解析为 UITableview
Posted
技术标签:
【中文标题】将 Json 解析为 UITableview【英文标题】:Parsing Json to UITableview 【发布时间】:2018-02-24 00:17:35 【问题描述】:我有一个 UITableView,我需要使用我上网的一些 JSON 数据填充单元格。我已经成功获取并解析了数据。问题在于未使用正确数据创建单元格,因为它们是在 JSON 完成加载之前创建的,因此无法与数据一起显示。我知道您可以轻松使用tableView.reloadData()
,但我遇到了另一个问题。我需要在调用任何 tableView
方法之前下载数据。
这样做的原因是因为我想根据 JSON 中有多少单元格来返回单元格的数量。所以像jsoncells.count
到目前为止,这是我的代码:我有一些版本还可以,但是因为我一直在修改代码,所以它们已经消失了。
import UIKit
class TimelineViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
@IBOutlet weak var backgroundImageView: UIImageView!
var timelineCellDataArray = [[String:String]]()
override func viewDidLoad()
super.viewDidLoad()
setupBackground(backgroundImage: #imageLiteral(resourceName: "Placeholder 1.jpeg"))
func setupBackground(backgroundImage: UIImage)
backgroundImageView.image = backgroundImage
// Background Image Blur Effect:
let backgroundImageBlurEffect = UIBlurEffect(style: .light)
let backgroundImageBlurEffectView = UIVisualEffectView(effect: backgroundImageBlurEffect)
backgroundImageBlurEffectView.frame = backgroundImageView.frame
backgroundImageView.addSubview(backgroundImageBlurEffectView)
// Change View Controller To Profle View Controller
func setViewToProfileViewController()
print("H")
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "ProfileViewController") as! ProfileViewController
self.navigationController?.pushViewController(vc, animated: true)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 4
var isLoad = true
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
var cell = tableView.dequeueReusableCell(withIdentifier: "TimelineCell", for: indexPath) as! TimelineCell
// Json Parsing For Cell Populating
let urlString = "https://www.jasonbase.com/things/QRkQ.json"
let url = URL(string: urlString)
URLSession.shared.dataTask(with: url!) (data, response, error) in
if error != nil
else
do
let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:[[String:String]]]
self.timelineCellDataArray = parsedData["timelineCell"]!
DispatchQueue.main.async
print("we")
switch self.timelineCellDataArray[indexPath.row]["cellType"]
case "1"?:
cell = cell.createPostCell(cellToUse: cell)
case "2"?:
cell = cell.createPartyCell(cellToUse: cell)
case"3"?:
cell = cell.createFriendRequestCell(cellToUse: cell)
default:
break
tableView.reloadData()
self.isLoad = false
catch let error as NSError
print(error)
.resume()
print("WD")
return cell
这是我的 JSON https://www.jasonbase.com/things/QRkQ.json
【问题讨论】:
为什么要在 cellForRowAt 委托方法中重新加载 tableview?不要在 cellForRowAt 委托方法中创建数据集。使用前先用英语词典查一下动词“to accuse”。 好吧,就像我说的那样,我只是在修补看看它是否有效,但我这样做是为了让表格视图加载数据,并在加载数据后重新加载包含数据的单元格跨度> 从cellForRowAt
加载数据是个糟糕的主意。您需要从 viewDidLoad
或其他仅加载一次数据而不是每个单元格的适当位置加载数据。
好的,但是我如何在创建单元格之前加载该数据,因为记住单元格数据和我要创建的单元格数量将来自数据库
只是一个快速提示,您的createPostCell
不应该一次做所有这些事情:成为一个单元格的非静态函数,将一个单元格作为参数,并返回一个新单元格.让createPostCell
成为一个非静态函数是更好的编码实践,它接收用于填充该单元格实例的数据。
【参考方案1】:
在viewDidLoad
中进行 JSON 采集。然后,您可以创建一个全局变量(您似乎正在使用名为 timelineCellDataArray
的变量),该变量存储您每次从数据库中获取新数据时附加的数据。
从数据库中获取所有数据后,请致电tableView.reloadData()
。这样,在您的 numberOfRowsInSection
函数中,您只需返回 timelineCellDataArray.count
。在您的 cellForRowAt
函数中,您只需获取 timelineCellDataArray[index.row]
中的对象并使用此数据填充您的单元格。
【讨论】:
非常感谢,这很有帮助。所以基本上我在 viewdid 加载中获取数据并且数据完成后我重新加载将再次调用所有 tableView 函数的视图? 唯一的问题是我不能从外部函数执行 tableView.reloadData() 为您的tableView
创建一个出口,然后您可以在 viewDidLoad
中引用它以上是关于将 Json 解析为 UITableview的主要内容,如果未能解决你的问题,请参考以下文章