gpt4 book ai didi

swift - 以编程方式将列添加到 NSTableView

转载 作者:行者123 更新时间:2023-11-28 15:49:45 24 4
gpt4 key购买 nike

我正在尝试以编程方式将列添加到 NSTableView,这是我用 IB 定义的 View 的一部分,作为我想重用的自定义 View Controller 的一部分(我会自定义列对于每个特定用途)。

我正在使用数据源/委托(delegate)来提供行/列值。我将代码简化为重现问题所需的最少代码。

该表显示了完全古怪的行为:我创建了 1000 行,但只显示前 ~17 行(适合初始视口(viewport)的行),其余的(通过向下滚动可见)是空的。向上滚动时,即使是最初的那些现在也不见了。此外,行 View 被剪裁。

这是一个行为视频: https://www.youtube.com/watch?v=toRpIfp5A6w

对于那些无法播放视频的人,这是滚动到一半的屏幕截图。请记住,该表应该有 1000 行。

Table view visual errors

这是我的代码。

AppDelegate

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

@IBOutlet weak var window: NSWindow!

func applicationDidFinishLaunching(_ aNotification: Notification) {
let controller = TestViewController()
self.window.contentView?.addSubview(controller.view)
controller.view.translatesAutoresizingMaskIntoConstraints = false
controller.view.heightAnchor.constraint(equalTo: self.window.contentView!.heightAnchor).isActive = true
controller.view.widthAnchor.constraint(equalTo: self.window.contentView!.widthAnchor).isActive = true
controller.view.trailingAnchor.constraint(equalTo: self.window.contentView!.trailingAnchor).isActive = true
}

func applicationWillTerminate(_ aNotification: Notification) {
}
}

View Controller

import Cocoa

class TestViewController: NSViewController {

@IBOutlet weak var tableView: NSTableView!
private var tableSource = TestTableSource()

override func viewDidLoad() {
super.viewDidLoad()
let columns = self.tableView.tableColumns
columns.forEach {
self.tableView.removeTableColumn($0)
}
let column = NSTableColumn(identifier: "c1")
column.title = "COL1"
self.tableView.addTableColumn(column)
self.tableView.delegate = self.tableSource
self.tableView.dataSource = self.tableSource
self.tableView.reloadData()
}
}

class TestTableSource: NSObject, NSTableViewDelegate, NSTableViewDataSource {

let array = (0..<1000).map { "row \($0)" }

func numberOfRows(in tableView: NSTableView) -> Int {
return array.count
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
guard tableColumn?.identifier == "c1" else { fatalError() }
let view = NSTextField(string: array[row])
return view
}
}

在 IB 中查看 Controller

这些是 NSTableView 设置 NSTableView settings

NSTableView settings 2

欢迎就如何解决问题提出任何建议!

编辑:我忘记切换到基于 View 。我上传了新的截图。问题依然存在。

最佳答案

已解决: TableView 委托(delegate)/数据源被立即释放,因为没有任何东西对它进行强引用。

由于委托(delegate)是 NSTableView 中的弱属性,任何进一步获取单元格值的尝试都将失败。

长话短说:TestViewController 被声明为范围变量,然后它的 View 被添加到 View 层次结构中。但是由于这个 View Controller 本身没有任何内容,它被立即释放。由于 View Controller 是持有委托(delegate)/数据源的那个,因此它也将被释放。

感谢 @biappi帮助我解决这个问题。

关于swift - 以编程方式将列添加到 NSTableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42469876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com