NSTableView在初始加载时未更新

时间:2018-11-21 16:27:58

标签: swift nstableview

我有一个带有personTableView的NSTableView的NSView。在ViewController类中,我有以下代码:

override func viewDidLoad() {
    super.viewDidLoad()

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

}

并将类扩展为NSTableViewDelegateNSTableViewDataSource

但是,当视图出现时,该表将显示以下内容(该表仅应显示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()放入viewWillAppearviewDidAppear都无效。

更新:

这是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
    }
}

有关信息,这是表代表和数据源功能:

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 :(得分:0)

似乎基于存储在result变量中的数据填充了表视图。尝试拨打let result = CoreDataHandler.fetchCount()

中的viewDidLoad

答案 1 :(得分:0)

您混合了tableView(_:objectValueFor:row:)的{​​{1}}和NSTableViewDataSource的{​​{1}}。替换

tableView(_:viewFor:row:)

作者

NSTableViewDelegate

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

返回字符串