gpt4 book ai didi

swift - NSTableView 第一行最初出现在标题后面

转载 作者:行者123 更新时间:2023-11-28 09:49:59 25 4
gpt4 key购买 nike

我正在以编程方式在我的应用程序中创建 tableView,但我遇到了这个问题:

每当我的 tableView 的内容大小大于其框架时,tableView 的第一行最初会出现在标题下方,但它可以很容易地滚动回到该位置。

初始加载后窗口的屏幕截图。

Content size bigger than tableView frame(问题出在这里):

enter image description here

内容大小小于 tableView 框架(这里一切都很好):

enter image description here

我的 NSViewController 类代码:

class MainViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {

let label: NSTextField = {
let label = NSTextField()
label.stringValue = "Test App"
label.font = NSFont.boldSystemFont(ofSize: 14)
label.textColor = .white
label.alignment = .center
label.drawsBackground = false
label.isBezeled = false
label.isSelectable = true
label.isEditable = false
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()

let labelContainerView: NSView = {
let view = NSView()
view.translatesAutoresizingMaskIntoConstraints = false
return view
}()

let tableView: NSTableView = {
let tableView = NSTableView()
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.usesAlternatingRowBackgroundColors = true

let column = NSTableColumn(identifier: .init(rawValue: "MyColumnID"))
column.headerCell.title = "Test"
column.headerCell.alignment = .center
tableView.addTableColumn(column)

return tableView
}()

let scrollView: NSScrollView = {
let scrollView = NSScrollView()
scrollView.hasVerticalScroller = true
scrollView.translatesAutoresizingMaskIntoConstraints = false
return scrollView
}()

override func loadView() {
view = NSView()
view.wantsLayer = true
}

var names: [String] = []

override func viewDidLoad() {
super.viewDidLoad()

layoutUI()

for i in 1...9 {
let name = "Test \(i)"
names.append(name)
}

scrollView.documentView = tableView

tableView.delegate = self
tableView.dataSource = self
}



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

let newCell = MyCellView(identfier: NSUserInterfaceItemIdentifier(rawValue: "MyColumnID"))

newCell.textView.stringValue = names[row]

return newCell
}


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

func layoutUI() {
view.addSubview(labelContainerView)
view.addSubview(scrollView)
labelContainerView.addSubview(label)

NSLayoutConstraint.activate([
labelContainerView.topAnchor.constraint(equalTo: view.topAnchor),
labelContainerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
labelContainerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
labelContainerView.heightAnchor.constraint(equalTo: view.heightAnchor,
multiplier: 1/5),

label.centerXAnchor.constraint(equalTo: labelContainerView.centerXAnchor),
label.centerYAnchor.constraint(equalTo: labelContainerView.centerYAnchor,
constant: -4),

scrollView.heightAnchor.constraint(equalTo: view.heightAnchor,
multiplier: 4/5),
scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}

最佳答案

我不建议在代码中设置 NSTableView。在 Interface Builder 中执行此操作要容易得多,并且可以防止不必要的副作用。在任何情况下,如果 NSTableView 没有按预期显示第一行,我会在相关的 NSScrollView 上使用 scrollToVisible 以使第一行在加载数据后可见。

关于swift - NSTableView 第一行最初出现在标题后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088183/

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