NSTableView на основе представления не отображает содержимое ячеек - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь отобразить таблицу на основе данных, загруженных непосредственно через приложение. Для этого я использую NSTableView на основе представления. Каким-то образом в ячейках отображается «Ячейка табличного представления».

Я проверил предыдущие вопросы, но предложенные решения не помогли мне. Также нет сообщений об ошибках вообще.

Swift 5 используется, приложение Какао для MacOS.

import Cocoa
import CreateML
import Foundation

class ViewController: NSViewController {

    @IBOutlet weak var varsTable: NSTableView!

    var variables: [VarTypes] = []

    @IBAction func uploadButton(_ sender: Any) {
        let dialog = NSOpenPanel();

        dialog.title                   = "Choose a .csv file";
        dialog.showsResizeIndicator    = true;
        dialog.showsHiddenFiles        = false;
        dialog.canChooseDirectories    = true;
        dialog.canCreateDirectories    = true;
        dialog.allowsMultipleSelection = false;
        dialog.allowedFileTypes        = ["csv"];

        if (dialog.runModal() == NSApplication.ModalResponse.OK) {
            let result = dialog.url

            if let path = result?.absoluteURL {
                do {
                    let contents = try MLDataTable(contentsOf: path)

                    for i in 0..<contents.columnNames.count {
                        variables.append(VarTypes.init(varName: contents.columnTypes.map { $0.0 }[i], varType: String(describing: contents.columnTypes.map { $0.1 }[i])))
                    }

                    self.varsTable.reloadData()


                } catch {
                }
            } else {
                // the URL was bad!
            }
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        varsTable.delegate = self
        varsTable.dataSource = self
        self.varsTable.reloadData()
    }
}

extension ViewController: NSTableViewDataSource, NSTableViewDelegate {

    func numberOfRows(in varsTable: NSTableView) -> Int {
        return (variables.count)
    }

    func varsTable(_ varsTable: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {

        let varType = variables[row]

        guard let cell = varsTable.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else { return nil }

        if (tableColumn?.identifier)!.rawValue == "varName" {
            cell.textField?.stringValue = varType.varName
        } else {
            cell.textField?.stringValue = varType.varType
        }

        return cell
    }

}

Вот так выглядит раскадровка 1 .

1 Ответ

0 голосов
/ 04 июля 2019

Рекомендую использовать привязки какао.Это очень эффективно, и вы избавляетесь от большого количества кода.

  • Объявите вашу модель (пожалуйста, в единственном числе)

    @objcMembers
    class VarType: NSObject {
    
        dynamic var varName : String
        dynamic var varType : String
    }
    
  • Объявитемассив источника данных

    @objc dynamic var variables: [VarType] = []
    
  • Удалить весь viewDidLoad() метод, весь extension ViewController и все вхождения self.varsTable.reloadData()

Теперь часть Bindings входит.

  • Перейдите в Интерфейсный Разработчик и выберите представление таблицы (не представление прокрутки!)
  • Нажмите ⌥⌘7 , чтобывыберите Инспектора привязок
  • Привязать Content к View Controller Путь к ключу модели variables

    enter image description here

  • Выберите NSTextField первого столбца.Привязать Value к Table Cell View Путь к ключу модели objectValue.varName

  • Выберите NSTextField во втором столбце.Привязать Value к Table Cell View Путь к ключу модели objectValue.varType

Запустить приложение.

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