Arrays (自行回答)Swift数组在函数numberofRows中返回0计数(在tableView中,但在其他任何地方,它都返回正确的数组数量。计数

Arrays (自行回答)Swift数组在函数numberofRows中返回0计数(在tableView中,但在其他任何地方,它都返回正确的数组数量。计数,arrays,swift,macos,count,tableview,Arrays,Swift,Macos,Count,Tableview,我有一个从internet加载JSON文件并将其存储在数组和字典中的项目。当我在viewDitload或ViewDidEnglish中打印数组或Dict的计数时,我在JSON文件中得到了正确的50个计数。但是在tableViewDataSource的numberOfRows和objectForValue调用中,它返回0作为计数。我是ng一些东西,但在打开和关闭窗口时,数组中有信息,但当tableView以某种方式重新加载时,数组是空的。这是我的代码。非常感谢您的帮助 import Cocoa

我有一个从internet加载JSON文件并将其存储在数组和字典中的项目。当我在viewDitload或ViewDidEnglish中打印数组或Dict的计数时,我在JSON文件中得到了正确的50个计数。但是在tableViewDataSource的numberOfRows和objectForValue调用中,它返回0作为计数。我是ng一些东西,但在打开和关闭窗口时,数组中有信息,但当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自动重新加载之前没有加载信息。我猜在您从internet检索数据之前会调用
numberOfRows
。解决此问题的一种方法是在
coursesArray
中设置侦听器,尝试替换此选项:

var coursesArray: [Course] = []
为此:

var coursesArray: [Course] = [] {
    didSet {
        table.reloadData()
    }
}

问题不在于我的代码。问题在于我的Xib中有两个viewController实例,所以当我将东西硬编码到数组中时,它工作了,因为两个实例都有该信息,但第二个viewController的viewDidload从未计算过,因为它没有连接到任何视图是否在序列图像板或nib文件中连接了tableview
dataSource
?如果我将numberofRows替换为手动返回5,将objectValue替换为手动字符串“test”,则为“是”它们显示在表视图中。当我测试whit print staments时,我在两个表源函数中得到正确的每一处exept计数,我得到0返回,当你点击
refreshTable
按钮时,这是否正确填充了表?不,这太奇怪了。当我关闭应用程序时,当我打开应用程序时,信息在数组中应用程序信息在那里。我知道它在那里,因为我正在将它输出到控制台。它甚至在URLOAD之后直接在那里,因为我可以在那里打印它。在所有这些地方使用for in循环测试它。它不在那里。即使我在用控制台中的按钮重新加载数据之前打印信息,也可以直接获取计数不是一个计数。我在想,但是有一个手动重新加载按钮来做这件事,我甚至在重新加载之前放了一个print语句,然后它返回50,正如它应该返回的那样tableView。重新加载直接在那之后,然后是0。所以有些地方发生了一些事情。
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")
    }

}