首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(自行回答)Swift数组在函数numberofRows中返回0计数(在tableView中,但在其他任何地方它都会返回正确数量的array.count

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

Stack Overflow用户
提问于 2017-06-24 08:43:44
回答 3查看 279关注 0票数 0

我有一个项目,从互联网加载JSON文件,并将其存储在一个数组和一个字典中。当我在viewDitload或viewDidDisappear中打印数组或字典的计数时,我在JSON文件中得到了正确的计数50。但是在对tableViewDataSource的numberOfRows和objectForValue调用中,它为计数返回0。我忽略了一些东西,但在打开和关闭窗口时,数组中有信息,但当tableView重新加载时,不知何故,数组是空的。这里是我的代码任何帮助都是非常感谢的

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

发布于 2017-06-25 01:58:08

问题不在于我的代码。问题在于,我的Xib中有两个viewController实例,所以当我将一些东西硬编码到数组中时,它可以正常工作,因为这两个实例都有该信息,但是来自第二个视图控制器的viewDidload从未被调用,因为它没有连接到任何视图

票数 1
EN

Stack Overflow用户

发布于 2017-06-24 12:21:48

我猜在你从互联网上检索数据之前,numberOfRows已经被调用了。解决这个问题的一种方法是在coursesArray中设置一个侦听器,尝试替换以下内容:

代码语言:javascript
运行
复制
var coursesArray: [Course] = []

有了这个:

代码语言:javascript
运行
复制
var coursesArray: [Course] = [] {
    didSet {
        table.reloadData()
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-06-24 15:59:25

代码语言:javascript
运行
复制
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")
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44731674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档