IOS/Swift 在 JSON 请求后呈现 table
IOS/Swift rendering table after JSON request
我是 IOS 和 swift 的新手。我正在尝试实现 api get returns json 的请求,然后将其显示在 table 中。以下是我当前的代码。当我 运行 模拟器时,出现以下错误:
致命错误:无法索引空缓冲区
如果我在 tableView 函数中删除硬编码的 return 3 而是使用 doDatItems.count 在 table 中没有任何渲染,因为我猜 doDatItems 数组开始在发出 get 请求之前为空。好像是时间问题?如何确保在 table 加载之前发出获取请求?
import UIKit
class ViewController: UIViewController, UITableViewDelegate {
var doDatItems:[String] = []
@IBOutlet weak var doDatItem: UITextField!
@IBOutlet weak var yourDoDats: UILabel!
@IBAction func addDoDat(sender: AnyObject) {
doDatItems.append(doDatItem.text)
println(doDatItems)
}
override func viewDidLoad() {
super.viewDidLoad()
let urlPath = "http://localhost:3000/dodats"
let url: NSURL = NSURL(string: urlPath)!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
println("Task completed")
if((error) != nil) {
// If there is an error in the web request, print it to the console
println(error.localizedDescription)
}
var err: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
if(err != nil) {
// If there is an error parsing JSON, print it to the console
println("JSON Error \(err!.localizedDescription)")
} else {
let dataArray = jsonResult["dodats"] as [String]
for item in dataArray {
self.doDatItems.append(item)
}
// println(self.doDatItems)
}
})
task.resume()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
println(self.doDatItems)
cell.textLabel?.text = self.doDatItems[indexPath.row]
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我发现了几个问题 -
您 ViewController 应该符合 UITableViewDatasource(它丢失了,不确定它是如何做到的)
不要return 3当self.doDatItems没有任何物品时。它会导致崩溃。只要数据加载让 table 保持为空。 return self.doDatItems.count
从 self.doDatItems 数组加载数据并准备好显示后,只需调用 table 视图的 reloadData() 方法即可。
在此之前,您应该有一个 tableView 的引用(或 IBOutlet),以便您可以从任何地方调用 reloadData()。
在这个委托方法中,return行数,
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
不要将静态数字用作 3。在此处获取数组计数和 return 计数。
json响应到来后,重新加载tableView。 objective-c 由
完成
[tableView reloadData];
接收并解析数据后,您需要触发页面刷新。
类似于
self.tableView.reloadData()
我是 IOS 和 swift 的新手。我正在尝试实现 api get returns json 的请求,然后将其显示在 table 中。以下是我当前的代码。当我 运行 模拟器时,出现以下错误:
致命错误:无法索引空缓冲区
如果我在 tableView 函数中删除硬编码的 return 3 而是使用 doDatItems.count 在 table 中没有任何渲染,因为我猜 doDatItems 数组开始在发出 get 请求之前为空。好像是时间问题?如何确保在 table 加载之前发出获取请求?
import UIKit
class ViewController: UIViewController, UITableViewDelegate {
var doDatItems:[String] = []
@IBOutlet weak var doDatItem: UITextField!
@IBOutlet weak var yourDoDats: UILabel!
@IBAction func addDoDat(sender: AnyObject) {
doDatItems.append(doDatItem.text)
println(doDatItems)
}
override func viewDidLoad() {
super.viewDidLoad()
let urlPath = "http://localhost:3000/dodats"
let url: NSURL = NSURL(string: urlPath)!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
println("Task completed")
if((error) != nil) {
// If there is an error in the web request, print it to the console
println(error.localizedDescription)
}
var err: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
if(err != nil) {
// If there is an error parsing JSON, print it to the console
println("JSON Error \(err!.localizedDescription)")
} else {
let dataArray = jsonResult["dodats"] as [String]
for item in dataArray {
self.doDatItems.append(item)
}
// println(self.doDatItems)
}
})
task.resume()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")
println(self.doDatItems)
cell.textLabel?.text = self.doDatItems[indexPath.row]
return cell
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我发现了几个问题 -
您 ViewController 应该符合 UITableViewDatasource(它丢失了,不确定它是如何做到的)
不要return 3当self.doDatItems没有任何物品时。它会导致崩溃。只要数据加载让 table 保持为空。 return self.doDatItems.count
从 self.doDatItems 数组加载数据并准备好显示后,只需调用 table 视图的 reloadData() 方法即可。
在此之前,您应该有一个 tableView 的引用(或 IBOutlet),以便您可以从任何地方调用 reloadData()。
在这个委托方法中,return行数,
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
不要将静态数字用作 3。在此处获取数组计数和 return 计数。
json响应到来后,重新加载tableView。 objective-c 由
完成[tableView reloadData];
接收并解析数据后,您需要触发页面刷新。
类似于
self.tableView.reloadData()