在没有 nib 的情况下使用 NSTableView 创建 NSScrollView——缺少对 TableView 的约束
Creating NSScrollView with NSTableView without a nib—missing constraints on the TableView
我正在尝试构建一个以 NSTableView 作为内容的 NSScrollView,但我收到一条错误消息,说我缺少 Table 上的约束,我正在不知道我错过了什么。我正在使用 SnapKit 进行布局,错误消息是 Detected missing constraints for <NSTableView: 0x10100aaf0>. It cannot be placed because there are not enough constraints to fully define the size and origin.
.
我的 ViewController 代码是:
class MainViewController: NSViewController {
let table: NSTableView = {
let t = NSTableView(frame: .zero)
t.headerView?.isHidden = false
t.selectionHighlightStyle = .regular
t.translatesAutoresizingMaskIntoConstraints = false
t.autoresizingMask = [.height, .width]
t.usesAlternatingRowBackgroundColors = true
let col1 = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("Name"))
col1.headerCell = NSTableHeaderCell(textCell: "Name")
t.addTableColumn(col1)
return t
}()
required init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
view = NSView(frame: .zero)
let scrollView = NSScrollView(frame: .zero)
scrollView.hasVerticalScroller = true
scrollView.autohidesScrollers = false
scrollView.documentView = table
view.addSubview(scrollView)
/// Layout
scrollView.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(Padding.large)
}
}
大多数在线指南都适合使用 Nib,但我正在尝试以编程方式进行。任何人都知道它是如何完成的?我正在使用 XCode 9.2 和 Swift 4。谢谢。
我的猜测是您忘记为 tableView
本身添加约束,以描述它应该如何在封闭的滚动视图中布局。
您可以在 DETECTED_MISSING_CONSTRAINTS
上设置 符号断点 。 Here is a video 展示了如何设置符号断点,以防您从未遇到过它们。
它应该可以更深入地了解到底出了什么问题。约束是一件棘手的事情,如果不看全貌可能很难推理。
我通过简单地让 table 视图使用由自动调整大小掩码自动设置的约束来消除错误。 SnapKit 自动设置行 translatesAutoresizingMaskIntoConstraints = false
,因此将其设置为 true
似乎可行。
let table: NSTableView = {
let t = NSTableView(frame: .zero)
t.headerView?.isHidden = false
t.selectionHighlightStyle = .regular
t.translatesAutoresizingMaskIntoConstraints = true
t.usesAlternatingRowBackgroundColors = true
let col1 = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("Name"))
col1.headerCell = NSTableHeaderCell(textCell: "Name")
t.addTableColumn(col1)
return t
}()
我正在尝试构建一个以 NSTableView 作为内容的 NSScrollView,但我收到一条错误消息,说我缺少 Table 上的约束,我正在不知道我错过了什么。我正在使用 SnapKit 进行布局,错误消息是 Detected missing constraints for <NSTableView: 0x10100aaf0>. It cannot be placed because there are not enough constraints to fully define the size and origin.
.
我的 ViewController 代码是:
class MainViewController: NSViewController {
let table: NSTableView = {
let t = NSTableView(frame: .zero)
t.headerView?.isHidden = false
t.selectionHighlightStyle = .regular
t.translatesAutoresizingMaskIntoConstraints = false
t.autoresizingMask = [.height, .width]
t.usesAlternatingRowBackgroundColors = true
let col1 = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("Name"))
col1.headerCell = NSTableHeaderCell(textCell: "Name")
t.addTableColumn(col1)
return t
}()
required init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func loadView() {
view = NSView(frame: .zero)
let scrollView = NSScrollView(frame: .zero)
scrollView.hasVerticalScroller = true
scrollView.autohidesScrollers = false
scrollView.documentView = table
view.addSubview(scrollView)
/// Layout
scrollView.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(Padding.large)
}
}
大多数在线指南都适合使用 Nib,但我正在尝试以编程方式进行。任何人都知道它是如何完成的?我正在使用 XCode 9.2 和 Swift 4。谢谢。
我的猜测是您忘记为 tableView
本身添加约束,以描述它应该如何在封闭的滚动视图中布局。
您可以在 DETECTED_MISSING_CONSTRAINTS
上设置 符号断点 。 Here is a video 展示了如何设置符号断点,以防您从未遇到过它们。
它应该可以更深入地了解到底出了什么问题。约束是一件棘手的事情,如果不看全貌可能很难推理。
我通过简单地让 table 视图使用由自动调整大小掩码自动设置的约束来消除错误。 SnapKit 自动设置行 translatesAutoresizingMaskIntoConstraints = false
,因此将其设置为 true
似乎可行。
let table: NSTableView = {
let t = NSTableView(frame: .zero)
t.headerView?.isHidden = false
t.selectionHighlightStyle = .regular
t.translatesAutoresizingMaskIntoConstraints = true
t.usesAlternatingRowBackgroundColors = true
let col1 = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("Name"))
col1.headerCell = NSTableHeaderCell(textCell: "Name")
t.addTableColumn(col1)
return t
}()