Swift 为什么我的NSTableView显示的数据错误?

Swift 为什么我的NSTableView显示的数据错误?,swift,xcode,nstableview,nstableviewcell,Swift,Xcode,Nstableview,Nstableviewcell,我的NSTableView似乎镜像了所有绘制字符串的内容。 我以前从未见过这样的事情,希望有人能给我一个解决这个问题的建议。我已经查过了,但什么也找不到。我也提交了一份bug报告,但苹果没有回应 我的第一个想法是:它一定和NSTextField和NSPoupButton在开始时被禁用有关。它们仅在单击一个单元格时启用。当它们被启用时,文本将以正确的方式显示。但我不想在开始时启用它们,以防止意外单击一个单元格而更改值 我的代码似乎很好,编译起来没有问题 该程序是一个简单的数据库程序,它采用自己创建

我的NSTableView似乎镜像了所有绘制字符串的内容。 我以前从未见过这样的事情,希望有人能给我一个解决这个问题的建议。我已经查过了,但什么也找不到。我也提交了一份bug报告,但苹果没有回应

我的第一个想法是:它一定和NSTextField和NSPoupButton在开始时被禁用有关。它们仅在单击一个单元格时启用。当它们被启用时,文本将以正确的方式显示。但我不想在开始时启用它们,以防止意外单击一个单元格而更改值

我的代码似乎很好,编译起来没有问题

该程序是一个简单的数据库程序,它采用自己创建的文件类型并读取其内容。它在运行时从内容创建数据库、表、列和单元格对象,以显示数据库内容

以下是我的NSTableView代码:

import Cocoa

class TableContentViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
    @IBOutlet weak var tableContent: NSTableView!
    var columnDragFrom:Int = -1
    override func viewDidLoad() {
        super.viewDidLoad()
        tableContent.dataSource = self
        tableContent.delegate = self
        // Do view setup here.
        tableContent.backgroundColor = NSColor(named: "darkColor")!
        NotificationCenter.default.addObserver(self, selector: #selector(reloadData(_:)), name: .tableUpdated, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(cellSelection(_:)), name: .cellSelection, object: nil)
        tableContent.selectionHighlightStyle = .none
    }

    @objc func cellSelection(_ notification: Notification) {
        if let cell = notification.object as? NSTableCellView {
            nxSelectionHandler.currentRow = tableContent.row(for: cell)
            nxSelectionHandler.currentColumn = tableContent.column(for: cell)
            nxSelectionHandler.highlightCell(sender: tableContent)
        }
    }

    @objc func reloadData(_ notification: Notification) {
        setupTable()
        tableContent.reloadData()
    }

    func setupTable() {
        tableContent.rowHeight = 30
        while(tableContent.tableColumns.count > 0) {
            tableContent.removeTableColumn(tableContent.tableColumns.last!)
        }
        if nxSelectionHandler.currentTable != nil {
            for column in (nxSelectionHandler.currentTable?.nxColumns)! {
                let newColumn = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: column.title))
                newColumn.title = column.title
                tableContent.addTableColumn(newColumn)
            }
        }
    }

    func numberOfRows(in tableView: NSTableView) -> Int {
        if nxSelectionHandler.currentTable != nil {
            var rowCounts:[Int] = []
            for column in (nxSelectionHandler.currentTable?.nxColumns)! {
                rowCounts.append(column.nxCells.count)
            }
            return rowCounts.max()!
        }
        return 0
    }

    func tableView(_ tableView: NSTableView, mouseDownInHeaderOf tableColumn: NSTableColumn) {
        self.columnDragFrom = tableView.tableColumns.firstIndex(of: tableColumn)!
    }

    func tableView(_ tableView: NSTableView, didDrag tableColumn: NSTableColumn) {
        nxSelectionHandler.currentTable?.nxColumns.swapAt(columnDragFrom, tableView.tableColumns.firstIndex(of: tableColumn)!)
        tableView.reloadData()
    }

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        let column = tableView.tableColumns.firstIndex(of: tableColumn!)
        if nxSelectionHandler.currentTable != nil {
            let nxCell = nxSelectionHandler.currentTable?.nxColumns[column!].nxCells[row]
            switch nxCell! {
            case .nxString(let value):
                var StringCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxString"), owner: self) as? StringCell
                if StringCellView == nil {
                    tableView.register(NSNib(nibNamed: "StringCellNib", bundle: nil), forIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxString"))
                    StringCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxString"), owner: self) as? StringCell
                }
                StringCellView?.textField?.stringValue = value
                return StringCellView
            case .nxCheckbox(let state):
                var CheckboxCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxCheckbox"), owner: self) as? CheckboxCell
                if CheckboxCellView == nil {
                    tableView.register(NSNib(nibNamed: "CheckboxCellNib", bundle: nil), forIdentifier: NSUserInterfaceItemIdentifier("nxCheckbox"))
                    CheckboxCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxCheckbox"), owner: self) as? CheckboxCell
                }
                CheckboxCellView?.column = column!
                CheckboxCellView?.row = row
                CheckboxCellView?.checkbox.state = state
                return CheckboxCellView
            case .nxSelection(let selection, let options):
                var SelectionCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxSelection"), owner: self) as? SelectionCell
                if SelectionCellView == nil {
                    tableView.register(NSNib(nibNamed: "SelectionCellNib", bundle: nil), forIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxSelection"))
                    SelectionCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "nxSelection"), owner: self) as? SelectionCell
                }
                SelectionCellView?.column = column!
                SelectionCellView?.row = row
                for option in options {
                    SelectionCellView?.selection.addItem(withTitle: option)
                }
                SelectionCellView?.selection.selectItem(at: selection)
                return SelectionCellView
            }
        }
        return nil
    }
}
代码中使用的对象都是类类型,单元格从NIB加载,在NIB中,单元格都有约束并以正确的方式显示。NSTableView的屏幕截图显示了错误的内容,如下所示

其中一个自定义单元格的代码:

import Cocoa

class StringCell: NSTableCellView, NSTextFieldDelegate {
    var isSelected: Bool = false {
        didSet {
            self.needsDisplay = true
        }
    }

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        // Drawing code here.
        self.textField?.focusRingType = .none
        self.textField?.textColor = NSColor.white
        self.textField?.delegate = self
        self.wantsLayer = true
        self.layer?.borderWidth = 2
        self.layer?.cornerRadius = 2
        if isSelected {
            self.layer?.borderColor = NSColor.systemBlue.cgColor
        } else {
            self.layer?.borderColor = NSColor.clear.cgColor
            self.textField?.isEnabled = false
            self.textField?.isEditable = false
        }
    }

    override func mouseDown(with event: NSEvent) {
        if self.isSelected {
            self.textField?.isEditable = true
            self.textField?.isEnabled = true
            self.textField?.selectText(self)
        } else {
            self.isSelected = true
            NotificationCenter.default.post(name: .cellSelection, object: self)
        }
    }

    func controlTextDidEndEditing(_ obj: Notification) {
        if let textField = obj.object as? NSTextField {
            nxSelectionHandler.currentCell = nxCell.nxString(textField.stringValue)
        }
    }

}

是的,这很奇怪。您是否检查了视图效果检查器中是否有任何活动的内容过滤器


请提供一个。无活动内容筛选器。。我确实检查了每件物品。直到现在我还不知道内容过滤器是什么,奇怪的是,现在每次我试着做一个屏幕截图,文本都是以正确的方式显示的。当我重新启动程序时,所有内容都会再次镜像。一旦我在mac上启动屏幕截图程序,它就会再次显示。