【问题标题】:Want open a plist in NStableview想在 NStableview 中打开一个 plist
【发布时间】:2019-03-03 10:56:55
【问题描述】:

我已经尝试在 NSTableView 中显示一个 plist 文件好几天了。我已经阅读了很多,但到目前为止只找到了 iOS 的说明。我的问题是单个值在 NStableView 中没有单独显示。始终只显示单元格中的整个 plist 文件。

我希望有人可以帮助我,因为我无法更进一步。我还是 Swift 的大一新生。

我上传了我的 Plist,如果有人可以解释我的错误所在。

https://www.dropbox.com/s/1t8c4uldwdtp3wk/Archiv.zip?dl=0

import Cocoa


class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

@IBOutlet weak var tableView: NSTableView!

@IBOutlet weak var ntext: NSTextField!
@IBOutlet weak var schwarztext: NSTextField!
@IBOutlet weak var cyantext: NSTextField!
@IBOutlet weak var magentatext: NSTextField!
@IBOutlet weak var gelbtext: NSTextField!
@IBOutlet weak var lightcyantext: NSTextField!
@IBOutlet weak var lightmtext: NSTextField!

var n : String? = nil; // n
var schwarz : String? = nil; // Schwarz
var cyan : String? = nil; // Cyan
var magenta : String? = nil; // Magenta
var gelb : String? = nil; // Gelb
var lightc : String? = nil; // Light Cyan
var lightm : String? = nil; // Light Magenta

let AUTO_PLIST_JOBS_PATH = Bundle.main.path(forResource: "Jobs", ofType: "plist")

let AUTO_PLIST_JOBS_KEY_N = "n"   // n
let AUTO_PLIST_JOBS_KEY_SCHWARZ = "schwarz"   // Schwarz
let AUTO_PLIST_JOBS_KEY_CYAN = "cyan"   // Cyan
let AUTO_PLIST_JOBS_KEY_MAGENTA = "magenta"   // Magenta
let AUTO_PLIST_JOBS_KEY_GELB = "gelb"   // Gelb
let AUTO_PLIST_JOBS_KEY_LIGHTC = "lightc"   // Light Cyan
let AUTO_PLIST_JOBS_KEY_LIGHTM = "lightm"   // Light Magenta

var _jobss = [Jobs]()

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.delegate = self
    tableView.dataSource = self

    // Do any additional setup after loading the view.


}

func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {

    //let path = Bundle.main.path(forResource: "Jobs", ofType: "plist")
    //let myJobs100 = NSArray(contentsOfFile: path!)
    //return myJobs100


    let path = Bundle.main.path(forResource: "Jobs", ofType: "plist")
    let url = URL(fileURLWithPath: path!)
    let data = try! Data(contentsOf: url)
    let plist = try! PropertyListSerialization.propertyList(from: data, options: .mutableContainers, format: nil)

    let dictArray = plist as! [[String:String]]
    return dictArray
}


func allJobss() -> [Jobs]{

    if _jobss.count > 0 {
        return _jobss
    }

    if let allDatas = NSArray(contentsOfFile: AUTO_PLIST_JOBS_PATH!) {

        for dict in allDatas {
            guard let dict = dict as? [String: AnyObject] else {continue}

            let jobs = Jobs()
            jobs.n = dict[AUTO_PLIST_JOBS_KEY_N] as? String // n
            jobs.schwarz = dict[AUTO_PLIST_JOBS_KEY_SCHWARZ] as? String // Schwarz
            jobs.cyan = dict[AUTO_PLIST_JOBS_KEY_CYAN] as? String // Cyan
            jobs.magenta = dict[AUTO_PLIST_JOBS_KEY_MAGENTA] as? String // Magenta
            jobs.gelb = dict[AUTO_PLIST_JOBS_KEY_GELB] as? String // Gelb
            jobs.lightc = dict[AUTO_PLIST_JOBS_KEY_LIGHTC] as? String // Light Cyan
            jobs.lightm = dict[AUTO_PLIST_JOBS_KEY_LIGHTM] as? String // Light Magenta
            _jobss.append(jobs)
        }
    }
    return _jobss
}



func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    return 80
}

func numberOfRows(in tableView: NSTableView) -> Int {
    return allJobss().count
}

func tableViewSelectionDidChange(_ notification: Notification) {
    print(tableView.selectedRow)

    let path = Bundle.main.path(forResource: "Jobs", ofType: "plist")
    let url = URL(fileURLWithPath: path!)
    let data = try! Data(contentsOf: url)
    let plist = try! PropertyListSerialization.propertyList(from: data, options: .mutableContainers, format: nil)

    let dictArray = plist as! [[String:String]]
    // [[String:String]] is equivalent to Array< Dictionary<String, String> >

    print(dictArray[tableView.selectedRow]["n"] as Any)



}



override var representedObject: Any? {
    didSet {
    // Update the view, if already loaded.
    }
}

}

NSTableview

Plist

我希望有人可以帮助我。

【问题讨论】:

    标签: swift plist nstableview


    【解决方案1】:

    首先是 Swift。包含下划线字符的变量名很难看,而且 objective-c-ish

    您的工作流程有误。 objectValueFor 经常被调用(每行一次)并且应该只返回给定行/列的对象。一遍又一遍地读取相同的数据是可怕的。

    viewDidLoad 中加载数据一次,并将 Plist 直接解码为一个类。需要一个类才能绑定值

    @objcMembers
    class Job : NSObject, Decodable {
        dynamic var n, schwarz, cyan, magenta, gelb, lightc, lightm : String
    }
    

    @objc dynamic var jobs = [Job]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
    
        // Do any additional setup after loading the view.
        let url = Bundle.main.url(forResource: "Jobs", withExtension: "plist")!
        let data = try! Data(contentsOf: url)
        jobs = try! PropertyListDecoder().decode([Job].self, from: data)
        tableView.reloadData()
    }
    

    objectValueFor 中只返回该行的项目

    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
         return jobs[row]
    }
    

    其他委托方法是

    func numberOfRows(in tableView: NSTableView) -> Int {
        return jobs.count
    }
    
    func tableViewSelectionDidChange(_ notification: Notification) {
        let selectedRow = tableView.selectedRow
        if selectedRow == -1 {
           print("Nothing selected")
        } else {
          print("Row \(selectedRow) selected")
        }
    }
    

    您必须将值绑定到文本字段。打开Interface Builder,⌃⇧-点击在表格视图中最左边的文本字段(Table View Cell),选择Table View Cell,按⌥⌘ 7 打开Bindings Inspector,点击Value下方的三角形,勾选Bind to Table Cell View复选框,在Model Key Path文本字段中写入objectValue.n。将行中的其他文本字段绑定到相应的属性(objectValue.schwarz 等)。


    你可以删除

    var n : String? = nil; // n
    var schwarz : String? = nil; // Schwarz
    var cyan : String? = nil; // Cyan
    var magenta : String? = nil; // Magenta
    var gelb : String? = nil; // Gelb
    var lightc : String? = nil; // Light Cyan
    var lightm : String? = nil; // Light Magenta
    
    let AUTO_PLIST_JOBS_PATH = Bundle.main.path(forResource: "Jobs", ofType: "plist")
    
    let AUTO_PLIST_JOBS_KEY_N = "n"   // n
    let AUTO_PLIST_JOBS_KEY_SCHWARZ = "schwarz"   // Schwarz
    let AUTO_PLIST_JOBS_KEY_CYAN = "cyan"   // Cyan
    let AUTO_PLIST_JOBS_KEY_MAGENTA = "magenta"   // Magenta
    let AUTO_PLIST_JOBS_KEY_GELB = "gelb"   // Gelb
    let AUTO_PLIST_JOBS_KEY_LIGHTC = "lightc"   // Light Cyan
    let AUTO_PLIST_JOBS_KEY_LIGHTM = "lightm"   // Light Magenta
    
    func allJobss() -> [Jobs]{
    
        if _jobss.count > 0 {
            return _jobss
        }
    
        if let allDatas = NSArray(contentsOfFile: AUTO_PLIST_JOBS_PATH!) {
    
            for dict in allDatas {
                guard let dict = dict as? [String: AnyObject] else {continue}
    
                let jobs = Jobs()
                jobs.n = dict[AUTO_PLIST_JOBS_KEY_N] as? String // n
                jobs.schwarz = dict[AUTO_PLIST_JOBS_KEY_SCHWARZ] as? String // Schwarz
                jobs.cyan = dict[AUTO_PLIST_JOBS_KEY_CYAN] as? String // Cyan
                jobs.magenta = dict[AUTO_PLIST_JOBS_KEY_MAGENTA] as? String // Magenta
                jobs.gelb = dict[AUTO_PLIST_JOBS_KEY_GELB] as? String // Gelb
                jobs.lightc = dict[AUTO_PLIST_JOBS_KEY_LIGHTC] as? String // Light Cyan
                jobs.lightm = dict[AUTO_PLIST_JOBS_KEY_LIGHTM] as? String // Light Magenta
                _jobss.append(jobs)
            }
        }
        return _jobss
    }
    

    【讨论】:

    • 谢谢。但现在它向我显示了一个错误:让数据=尝试! Data(contentsOf: url)
    • 我同时编辑了答案,在前一行的末尾添加了!
    • 谢谢。现在它在下一行显示一个错误。工作=尝试! PropertyListDecoder().decode([Job].self, from: data)
    • 请使用我的建议将数据源数组声明为var jobs = [Job]()。结构应该以单数形式命名。每个实例代表一个Job
    • 我发现了问题。我在错误的行中有结构代码。现在它开始但显示 --> tableview.ViewController.Job(n: "13589", schwarz: "1.219", cyan: "0.666", magenta: "0.765", gelb: "3.107", lightc: "8.106", lightm: "7.965") i.stack.imgur.com/0TNAH.png
    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多