0

我使用故事板来设计我的基于NSTableView视图及其具有自动布局的子视图。它工作正常并且表现如预期。

在我的NSTableCellView,我有倍数NSTextField。我希望以编程方式更改其中一个中的框架。所以我尝试了这样的事情。

dataSource = NSTableViewDiffableDataSource<Section, Item>(tableView: someTableView, cellProvider: { tableView, tableColumn, row, item -> NSView in
            guard let tableCellView = tableView.makeView(withIdentifier: .someTableCellView, owner: self) as? SomeTableCellView else {
                fatalError()
            }

            tableCellView.randomTextField.stringValue = "Something..."
            tableCellView.someTextField.stringValue = "Blah..."

            //...

            let size = NSSize(width: 200, height: 50)
            tableCellView.someTextField.setFrameSize(size)
            tableCellView.someTextField.needsLayout = true
            tableCellView.needsLayout = true

            return tableCellView
        })

对于tableCellView.someTextFieldand tableCellView,我尝试了以下组合,但似乎没有任何改变:

  • .needsDisplay = true
  • .needsLayout = true
  • .invalidateIntrinsicContentSize()
  • .layoutSubtreeIfNeeded()
  • .updateConstraints()
  • .layout()

为什么这么难?我的理解是,如果我设置了一个新的帧大小someTextField,然后通知tableCellView它需要重新计算子视图布局位置,因为someTextField已被修改,因此其他子视图需要重新定位自己以与自动布局约束一致。

4

0 回答 0