Хочу открыть плист в NStableview - PullRequest
0 голосов
/ 03 марта 2019

Я пытался отобразить файл plist в NSTableView в течение нескольких дней.Я много читал, но пока нашел только инструкции для 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

Я надеюсь, что кто-то может мне помочь.

1 Ответ

0 голосов
/ 03 марта 2019

Прежде всего это Свифт.Имена переменных, включая символы подчеркивания, некрасивы и jective-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")
    }
}

Вам необходимо привязать значения к текстовым полям.Откройте Интерфейсный Разработчик, , нажмите 10 1026 * в самом левом текстовом поле (ячейка табличного представления) в представлении таблицы, выберите Ячейка табличного представления , нажмите ⌥⌘7 , чтобы открыть Инспектор привязок, щелкните раскрывающий треугольник ниже 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
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...