swift - NSTableView 不会调用 viewForTableColumn

标签 swift cocoa swift4 nstableview nstableviewcell

我试图在我的 Cocoa 应用程序中从头开始构建一个没有界面生成器的表格 View ,但我的 viewForTableColumn 方法拒绝被调用。

我的表格 View 是使用此代码创建的。

let tableView: NSTableView = {
    let table = NSTableView(frame: .zero)
    table.headerView = nil
    table.addTableColumn(NSTableColumn(identifier: .column))

    return table
}()

我还为 NSUserInterfaceItemIdentifier 类提供了此扩展

extension NSUserInterfaceItemIdentifier {
    static let cell = NSUserInterfaceItemIdentifier("cell")
    static let column = NSUserInterfaceItemIdentifier("column")
}

我的 View Controller 正在实现 NSTableViewDataSourceNSTableViewDelegate ,它们是在 viewDidLoad 方法中设置的。表格 View 也变成了 ScrollView 。

let scrollView = NSScrollView()

override func viewDidLoad() {
    self.scrollView.documentView = self.tableView
    self.scrollView.hasVerticalScroller = true
    self.view.addSubview(self.scrollView)

    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.reloadData() // To make sure the method would be called.
}

numberOfRows方法返回的值大于0并被执行。

根据我的理解,应该使用范围从 0 到 numberOfRows 返回的值的行参数来调用以下方法,但它从未被调用。

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    guard let view = self.tableView.makeView(withIdentifier: .cell, owner: self) as? NSTableCellView else {
        return nil
    }

    // set the text/font for the view

    return view
}

我还尝试过使用 dataCellForrowViewForRow 但它们都没有被调用。

编辑:

我已经检查了元素的框架,以确保 TableView 和行可见。

view hierarchy

最佳答案

根据您的问题 tableView(_:viewFor:row:) is 被调用的评论之一,它只是返回 nil 。考虑到您对该方法的实现,这是有道理的。当 makeViewWithIdentifier 失败时,您需要手动创建相关 View 并返回它,而不是返回 nil。因此,您的实现应该如下所示:

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

    if let recycledView = self.tableView.makeView(withIdentifier: .cell, owner: self) as? NSTableCellView {
        return recycledView
    } else {
        // create view from scratch
        let newCell = NSTableCellView()
        newCell.identifier = NSUserInterfaceItemIdentifier.cell
        // customise here...
        return newCell
    }
}

再次查看我在评论中提供的链接,您会发现该实现永远不会从此方法返回 nil

关于swift - NSTableView 不会调用 viewForTableColumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53626254/

相关文章:

ios - 添加 NavigationLink 时的 Swiftui 问题

objective-c - 收集 NSXMLDocument 警告输出

objective-c - NSImageView圆角+描边

cocoa - NSApp的keyWindow是什么时候创建的?

单例模式的Swift继承?

ios - imageView 下的空白区域

ios - 我可以在 IOS 中获取下载的 M4A、MP3 文件吗?

swift - 返回 View Controller Swift 4 时 AVFoundation 摄像机崩溃

ios - 使用未声明的类型 'MessagingDelegate'

iOS:如何以编程方式将 UI 从 LTR 更改为 RTL,反之亦然