NSTableView не обновляется при начальной загрузке - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть NSView с NSTableView с именем personTableView.В классе ViewController у меня есть следующий код:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    personTableView.delegate = self
    personTableView.dataSource = self
    personTableView.reloadData()

}

, и я расширил класс до NSTableViewDelegate и NSTableViewDataSource

Однако, когда появляется представление, таблица показываетследующее (есть только 2 записи, которые должны отображаться в таблице):

enter image description here

В моем окне у меня есть кнопка, которая вызывает следующее действие:

@IBAction func refreshButton(_ sender: NSButton) {
    let result = CoreDataHandler.fetchCount()
    print("Row Count:\(result)")
    personTableView.reloadData()
    codeTableView.reloadData()
}

, который при нажатии заполняет мой TableView.Я не понимаю, почему он не загружается автоматически?

Я также пытался вставить personTableView.reloadData() в viewWillAppear и viewDidAppear безрезультатно.

Обновление:

Это fetchCount ():

static func fetchCount() -> Int {
    let context = getContext()
    do {
        let count = try context.count(for: Person.fetchRequest())
        NSLog("Count from fetchCount: %d", count)
        return count
    } catch {
        return 0
    }
}

Для справки: функции Table Delegate и DataSource:

extension ViewController: NSTableViewDataSource {
    func numberOfRows(in tableView: NSTableView) -> Int {
        if tableView == self.personTableView {
            let result = CoreDataHandler.fetchCount()
            //NSLog("Rows in Ext: %@",result)
            return result
        }
        if tableView == self.codeTableView {
            let row = personTableView.selectedRow
            if row > -1 {
                let person = CoreDataHandler.fetchPerson()?[row]
                print("Person= \(String(describing: person?.first))")
                //let result = CoreDataHandler.fetchCodes(person: person!)
                let result = person?.codes
                //print("Person from result: \(String(describing: result?.first.whosAccount?.ibAccount))")
                let count = result!.count
                print("Rows in Codes from viewController dataSource: \(count)")
                return count
            } else {
            return 0
            }
        }
        return 0
    }
}

extension ViewController: NSTableViewDelegate {

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

        if tableView == self.personTableView {
            guard let person = CoreDataHandler.fetchPerson()?[row] else {
                return nil
            }

            if let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: nil) as? NSTableCellView {
                if tableColumn == tableView.tableColumns[0]  {
                    cell.textField?.stringValue = (person.first ?? nil) ?? ""
                } else if tableColumn == tableView.tableColumns[1] {
                    cell.textField?.stringValue = (person.last ?? nil) ?? ""
                } else {
                    cell.textField?.stringValue = (person.ibAccount ?? nil) ?? ""
                }

                return cell

            } else {
                return nil
            }
        }

        if tableView == self.codeTableView {

            let personRow = personTableView.selectedRow
            if personRow > -1 {
                let person = CoreDataHandler.fetchPerson()?[personRow]
                guard let code = CoreDataHandler.fetchCodes(person: person!)?[row] else {
                    return nil
                }

                if let cell = tableView.makeView(withIdentifier: (tableColumn!.identifier), owner: nil) as? NSTableCellView {
                    if tableColumn == tableView.tableColumns[0]  {
                        cell.textField?.stringValue = (String(code.number) )
                        //cell.textField?.stringValue = person?.codes?.allObjects[row] as! String
                    } else if tableColumn == tableView.tableColumns[1] {
                        cell.textField?.stringValue = code.code!

                    } else if tableColumn == tableView.tableColumns[2] {
                        cell.textField?.stringValue = (code.whosAccount?.ibAccount ?? "")
                    }

                    return cell

                } else {
                    return nil
                }
            }
        }

        return nil

    }



}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Вы перепутали tableView(_:objectValueFor:row:) из NSTableViewDataSource и tableView(_:viewFor:row:) из NSTableViewDelegate.Замените

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

на

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

или возвратите строки из tableView(_:objectValueFor:row:)

0 голосов
/ 21 ноября 2018

Представляется, что табличное представление заполняется на основе данных, хранящихся в переменной result.Попробуйте позвонить на let result = CoreDataHandler.fetchCount() в viewDidLoad

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