使用没有 nib 的 NSTableView 创建 NSScrollView — TableView 上缺少约束

Posted

技术标签:

【中文标题】使用没有 nib 的 NSTableView 创建 NSScrollView — TableView 上缺少约束【英文标题】:Creating NSScrollView with NSTableView without a nib—missing constraints on the TableView 【发布时间】:2018-08-19 20:01:26 【问题描述】:

我正在尝试构建一个以 NSTableView 作为内容的 NSScrollView,但我收到一条错误消息,提示我缺少表格上的约束并且我不确定我缺少什么。我正在使用 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。谢谢。

【问题讨论】:

【参考方案1】:

我的猜测是您忘记为 tableView 本身添加约束,以描述它应该如何在封闭的滚动视图中布局。

您可以在DETECTED_MISSING_CONSTRAINTS 上设置符号断点。 Here is a video 显示了如何设置符号断点,以防您从未遇到过它们。

它应该更深入地了解究竟是什么错误。约束是一项棘手的工作,如果不了解完整情况,可能很难推理。

【讨论】:

谢谢。我想知道如何设置符号断点。但是我仍然坚持要添加tableView 约束。我已经尝试将边缘捕捉到scrollView.content.edges,但它不起作用......滚动视图的大小为零,我无法在窗口中调整它的大小。我试过的代码是:table.snp.makeConstraints make in make.edges.equalTo(scrollView.contentView.snp.edges) 【参考方案2】:

我通过简单地让表格视图使用自动调整大小掩码自动设置的约束来消除错误。 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
()

【讨论】:

以上是关于使用没有 nib 的 NSTableView 创建 NSScrollView — TableView 上缺少约束的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 NSTableView 和自定义 NSViewController

NSTableView:创建“重叠”行

如何将现成的项目(使用应用程序委托创建和启动但没有 xib、nib)添加到另一个项目

NSTableView unhideRowsAtIndexes崩溃

加载时 NIB 视图没有子视图

NSTableView 的委托在创建行时收到 awakeFromNib 消息