将数据解析为表视图 swift 3
parsing data into tableview swift 3
我正在尝试解析来自网站的数据,然后按下按钮将其显示到表格视图中。我正在使用 swift 3、Xcode 8.2 beta,无法将数据存储到数组中或显示到 tableView 中。这是我的 tableViewCell class:
class TableViewCell: UITableViewCell {
@IBOutlet weak var userIdLabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
这是我的 viewController 代码:
import UIKit
class SecondViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {
let urlString = "https://jsonplaceholder.typicode.com/albums"
@IBOutlet weak var tableView: UITableView!
var titleArray = [String]()
var userIdArray = [String]()
@IBAction func getDataButton(_ sender: Any) {
self.downloadJSONTask()
self.tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func downloadJSONTask() {
let url = NSURL(string: urlString)
var downloadTask = URLRequest(url: (url as? URL)!, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 20)
downloadTask.httpMethod = "GET"
URLSession.shared.dataTask(with: (url! as URL), completionHandler: {(Data, URLResponse, Error) -> Void in
let jsonData = try? JSONSerialization.jsonObject(with: Data!, options: .allowFragments)
print(jsonData as Any)
if let albumArray = (jsonData! as AnyObject).value(forKey: "") as? NSArray {
for title in albumArray{
if let titleDict = title as? NSDictionary {
if let title = titleDict.value(forKey: "title") {
self.titleArray.append(title as! String)
print("title")
print(title)
}
if let title = titleDict.value(forKey: "userId") {
self.userIdArray.append(title as! String)
}
OperationQueue.main.addOperation ({
self.tableView.reloadData()
})
}
}
}
}).resume()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return titleArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
cell.titleLabel.text = titleArray[indexPath.row]
cell.userIdLabel.text = userIdArray[indexPath.row]
return cell
}
}
你的代码有很多很多问题,最糟糕的是在Swift中使用NSArray/NSDictionary
。
JSON是一个字典数组,键title
的值是String
,userID
的值是Int
,所以你有声明你的数组
var titleArray = [String]()
var userIdArray = [Int]()
永远不要将 JSON 数据投射到大多数未指定的 Any
那是另一个 no-go。始终将其转换为实际类型。另一个大问题是闭包中的 Data
参数与 Swift3
中的本机结构冲突。使用 always 小写参数标签。您的代码中根本没有使用该请求。在 Swift 3 中,始终使用原生结构 URL
、Data
、URLRequest
等。最后 .allowFragments
是无稽之谈,因为 JSON 显然以集合类型。
let url = URL(string: urlString)!
let request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 20)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
do {
if let jsonData = try JSONSerialization.jsonObject(with:data!, options: []) as? [[String:Any]] {
print(jsonData)
for item in jsonData {
if let title = item["title"] as? String {
titleArray.append(title)
}
if let userID = item["userId"] as? Int {
userIdArray.append(userID)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
} catch let error as NSError {
print(error)
}
}.resume()
PS:使用两个单独的数组作为数据源也很糟糕。想象一下,其中一个可选绑定可能会失败,并且数组中的项数会有所不同。这是运行时崩溃的好邀请。
我正在尝试解析来自网站的数据,然后按下按钮将其显示到表格视图中。我正在使用 swift 3、Xcode 8.2 beta,无法将数据存储到数组中或显示到 tableView 中。这是我的 tableViewCell class:
class TableViewCell: UITableViewCell {
@IBOutlet weak var userIdLabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
这是我的 viewController 代码:
import UIKit
class SecondViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {
let urlString = "https://jsonplaceholder.typicode.com/albums"
@IBOutlet weak var tableView: UITableView!
var titleArray = [String]()
var userIdArray = [String]()
@IBAction func getDataButton(_ sender: Any) {
self.downloadJSONTask()
self.tableView.reloadData()
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func downloadJSONTask() {
let url = NSURL(string: urlString)
var downloadTask = URLRequest(url: (url as? URL)!, cachePolicy: URLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 20)
downloadTask.httpMethod = "GET"
URLSession.shared.dataTask(with: (url! as URL), completionHandler: {(Data, URLResponse, Error) -> Void in
let jsonData = try? JSONSerialization.jsonObject(with: Data!, options: .allowFragments)
print(jsonData as Any)
if let albumArray = (jsonData! as AnyObject).value(forKey: "") as? NSArray {
for title in albumArray{
if let titleDict = title as? NSDictionary {
if let title = titleDict.value(forKey: "title") {
self.titleArray.append(title as! String)
print("title")
print(title)
}
if let title = titleDict.value(forKey: "userId") {
self.userIdArray.append(title as! String)
}
OperationQueue.main.addOperation ({
self.tableView.reloadData()
})
}
}
}
}).resume()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return titleArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
cell.titleLabel.text = titleArray[indexPath.row]
cell.userIdLabel.text = userIdArray[indexPath.row]
return cell
}
}
你的代码有很多很多问题,最糟糕的是在Swift中使用NSArray/NSDictionary
。
JSON是一个字典数组,键title
的值是String
,userID
的值是Int
,所以你有声明你的数组
var titleArray = [String]()
var userIdArray = [Int]()
永远不要将 JSON 数据投射到大多数未指定的 Any
那是另一个 no-go。始终将其转换为实际类型。另一个大问题是闭包中的 Data
参数与 Swift3
中的本机结构冲突。使用 always 小写参数标签。您的代码中根本没有使用该请求。在 Swift 3 中,始终使用原生结构 URL
、Data
、URLRequest
等。最后 .allowFragments
是无稽之谈,因为 JSON 显然以集合类型。
let url = URL(string: urlString)!
let request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 20)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
do {
if let jsonData = try JSONSerialization.jsonObject(with:data!, options: []) as? [[String:Any]] {
print(jsonData)
for item in jsonData {
if let title = item["title"] as? String {
titleArray.append(title)
}
if let userID = item["userId"] as? Int {
userIdArray.append(userID)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
} catch let error as NSError {
print(error)
}
}.resume()
PS:使用两个单独的数组作为数据源也很糟糕。想象一下,其中一个可选绑定可能会失败,并且数组中的项数会有所不同。这是运行时崩溃的好邀请。