我有一个项目,从互联网加载JSON文件,并将其存储在一个数组和一个字典中。当我在viewDitload或viewDidDisappear中打印数组或字典的计数时,我在JSON文件中得到了正确的计数50。但是在对tableViewDataSource的numberOfRows和objectForValue调用中,它为计数返回0。我忽略了一些东西,但在打开和关闭窗口时,数组中有信息,但当tableView重新加载时,不知何故,数组是空的。这里是我的代码任何帮助都是非常感谢的
import Cocoa
class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {
var coursesDict = [String: Course]()
var coursesArray = [Course]()
@IBAction func refreshTable(_ sender: Any) {
table.reloadData()
}
@IBOutlet weak var table: NSTableView!
func numberOfSectionsInTableView(tableView: NSTableView) -> Int {
return 1
}
func numberOfRows(in tableView: NSTableView) -> Int {
let numOfRows = coursesArray.count
print(numOfRows)
return numOfRows
}
func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
return coursesArray[row]
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if let data = UserDefaults.standard.data(forKey: "courses"),
let savedCourses = NSKeyedUnarchiver.unarchiveObject(with: data) as? [String: Course] {
self.coursesDict = savedCourses
loadDataFromURL()
self.coursesArray = Array(coursesDict.values)
print(coursesDict.count, " appLaunch")
} else {
print("There is an issue")
}
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
override func viewDidDisappear() {
let encodedData = NSKeyedArchiver.archivedData(withRootObject: coursesDict)
UserDefaults.standard.set(encodedData, forKey: "courses")
print(coursesDict.count, "viewUnload")
}
func loadDataFromURL() {
// Fetch URL
let url = URL(string: "https://www.apple.com/nl/today/static/data/hub/1101000001001110001.json")!
// Load Data
let data = try! Data(contentsOf: url)
// Deserialize JSON
let json = try! JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: AnyObject]
let coursesJSON = json?["courses"] as? [AnyObject]
for object in coursesJSON! {
let id = object["id"] as! String
if coursesDict[id] == nil {
let name = object["shortName"] as! String
let program = object["programName"] as! String
let shortDescription = object["shortDesc"] as! String
let mediumDescription = object["mediumDesc"] as! String
let longDescription = object["longDesc"] as! String
let imageURL = object["image"] as! String
let tempCourse = Course(id: id, name: name, program: program, shortDescription: shortDescription, mediumDescription: mediumDescription, longDescription: longDescription, imageURL: imageURL)
coursesDict[id] = tempCourse
}
}
print(coursesDict.count, "loadURL")
}
}我甚至在我的视图上有一个按钮,它可以在tableView自动重新加载之前没有加载信息的情况下重新加载tableView
发布于 2017-06-25 01:58:08
问题不在于我的代码。问题在于,我的Xib中有两个viewController实例,所以当我将一些东西硬编码到数组中时,它可以正常工作,因为这两个实例都有该信息,但是来自第二个视图控制器的viewDidload从未被调用,因为它没有连接到任何视图
发布于 2017-06-24 12:21:48
我猜在你从互联网上检索数据之前,numberOfRows已经被调用了。解决这个问题的一种方法是在coursesArray中设置一个侦听器,尝试替换以下内容:
var coursesArray: [Course] = []有了这个:
var coursesArray: [Course] = [] {
didSet {
table.reloadData()
}
}发布于 2017-06-24 15:59:25
func loadDataFromURL() {
// Fetch URL
let url = URL(string: "https://www.apple.com/nl/today/static/data/hub/1101000001001110001.json")!
// Load Data
let data = try! Data(contentsOf: url)
// Deserialize JSON
let json = try! JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: AnyObject]
let coursesJSON = json?["courses"] as? [AnyObject]
for object in coursesJSON! {
let id = object["id"] as! String
if coursesDict[id] == nil {
let name = object["shortName"] as! String
let program = object["programName"] as! String
let shortDescription = object["shortDesc"] as! String
let mediumDescription = object["mediumDesc"] as! String
let longDescription = object["longDesc"] as! String
let imageURL = object["image"] as! String
let tempCourse = Course(id: id, name: name, program: program, shortDescription: shortDescription, mediumDescription: mediumDescription, longDescription: longDescription, imageURL: imageURL)
coursesDict[id] = tempCourse
table.reloadData()
}
}
print(coursesDict.count, "loadURL")
}
}https://stackoverflow.com/questions/44731674
复制相似问题