swift - NSTableView 在初始加载时未更新

标签 swift nstableview

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

override func viewDidLoad() {
    super.viewDidLoad()

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

}

并将该类扩展为 NSTableViewDelegateNSTableViewDataSource

但是,当 View 出现时,表格显示以下内容(表格只应显示 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
    }
}

有关信息,这是表委托(delegate)和数据源函数:

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

    }



}

最佳答案

您混淆了 NSTableViewDataSourcetableView(_:viewFor:row:)tableView(_:objectValueFor: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:)返回字符串

关于swift - NSTableView 在初始加载时未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53416501/

相关文章:

ios - 自定义布局 UICollectionView swift

swift - Steam 3 : Route with arbitrary path segments

swift - Xcode 数组到 NSTableView

swift - 使用计时器定期更新 NSTableCellView 内的文本字段

objective-c - NSTableView 的选定列

SWIFT:+[CATransaction synchronize] 在解码 HTML 实体时在交易中调用

ios - swift/OpenGL ES 2.0 - 从 YUV420 缓冲区创建纹理

ios - 快速从调用者到被调用者的回调函数

objective-c - 以编程方式创建的 NSButtonCell 在单击时不会突出显示

macos - 使用 NSArrayController 过滤单列 NSTableView