Swift 3从字典填充表格视图?

Swift 3从字典填充表格视图?,swift,dictionary,nstableview,Swift,Dictionary,Nstableview,我已经创建了一个Profile类,我正试图让这个viewcontroller保存用户提供的信息中的账单Profile对象,然后让Profile以用户指定的名称显示在TableView的列表中。我曾尝试过使用数组,但决定放弃,因为字典似乎更合理,因为我可以将配置文件名作为键。并将其显示在表格中 但是,我在用配置文件填充表时遇到问题 任何帮助都将非常感谢,我愿意尝试任何建议。我将提供一张图片和代码 更新:仍然有点困惑,我用下面的代码创建了一个新文件,我得到了这个 你能做的就是使用一个数组来索引你

我已经创建了一个Profile类,我正试图让这个viewcontroller保存用户提供的信息中的账单Profile对象,然后让Profile以用户指定的名称显示在TableView的列表中。我曾尝试过使用数组,但决定放弃,因为字典似乎更合理,因为我可以将配置文件名作为键。并将其显示在表格中

但是,我在用配置文件填充表时遇到问题

任何帮助都将非常感谢,我愿意尝试任何建议。我将提供一张图片和代码

更新:仍然有点困惑,我用下面的代码创建了一个新文件,我得到了这个


你能做的就是使用一个数组来索引你的字典。可以从字典的keys数组属性生成数组。这里我已经按键进行了排序,但是您可能应该提供一个闭包来按概要文件名或其他一些更有意义的字段进行排序

    class V: UIViewController {
        @IBOutlet weak var tableView: UITableView!
        var profiles: [String: Profile] = [:]
        var indices: [String] = []
        override func viewDidLoad() {
            indices = profiles.keys.sorted()
        }
    }

    extension V: UITableViewDataSource {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return indices.count
        }
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: MyCell.self), for: indexPath) as MyCell
            cell.profile = profiles[indicies[indexPath.row]]!
            return cell
        }
    }

表格显示有序数据(即数组)。如果数据是字典格式,则需要以某种方式将其转换为数组。很明显,要做的事情是按关键字按字母顺序对词典条目进行排序。你能建议我完全切换到数组吗?或者有没有其他方式让我展示这个?谢谢你的回复@Nicolasmiarino不一定。你需要考虑什么是你的数据最方便的格式,基于它在你的应用程序周围的使用,而不仅仅是表视图。我只是将数组或字典用作存储和显示的表单。我为每一个属性创建了get和set,这样我就可以从profiles的对象中分别提取它们。这对NstableView也是一样吗?因为我在OS X上,所以我需要NsViewController而不是UI?不完全是这样,你必须修改它才能使用不同的NSTableViewDataSource方法(例如,UITableView是一维的,而NSTableView有一行和一列)但概念上是一样的:数据保存在字典中,字典中有一个键数组,表示表显示数据的顺序。我明白了。您是否建议我使用数组,而不是计划不按任何特定顺序显示数据?还是字典更好选择?除非出于某种原因需要字典,例如消除重复项,否则使用数组更直接。两种方法都有效;选择适合手头任务的更好方法。
class ProfileTable: NSViewController {

@IBOutlet weak var tableView: NSTableView!

var profiles: [String: Profile] = [:]
var indices: [String] = []
override func viewDidLoad() {
    indices = profiles.keys.sorted()
}
}
extension ProfileTable: NSTableViewDataSource {
func tableView(_ tableView: NSTableView, numberOfRowsInSection section: Int) -> Int {
    return indices.count
}
func tableView(_ tableView: NSTableView, cellForRowAt indexPath: IndexPath) -> NSTableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: MyCell.self), for: indexPath) as MyCell
    cell.profile = profiles[indices[indexPath.row]]!
    return cell
}
}
    class V: UIViewController {
        @IBOutlet weak var tableView: UITableView!
        var profiles: [String: Profile] = [:]
        var indices: [String] = []
        override func viewDidLoad() {
            indices = profiles.keys.sorted()
        }
    }

    extension V: UITableViewDataSource {
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return indices.count
        }
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: MyCell.self), for: indexPath) as MyCell
            cell.profile = profiles[indicies[indexPath.row]]!
            return cell
        }
    }