在没有 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
}()