与可变高度可编辑NSTextFields在MacOS的应用NSTableView的行

问题描述 投票:0回答:1

Xcode的10.1,雨燕4.2,MACOS 10.14.2

我试图做一个简单的做了,那里有一系列NSTableView行的MacOS的列表应用,每一个里面是一个NSTextField。每个字段是一个待完成项目。我想NSTableView行扩大以适应每个NSTextField中的文本的大小。

我有以下所有工作的:

  1. 设置在NSTextField文字中并根据需要NSTableView行扩大。自动布局约束在我的故事板设置。
  2. 使用tableView.reloadData(forRowIndexes: ..., columnIndexes: ...)设置文本和正确调整大小的表行。 reloadData works但这样做tableView.reloadData()NSTextField文本单行总是复位如下所示:如果你点击进入reloadData fails重新加载整个表后,有趣的是NSTextField,现场调整大小以适合再次对其内容:Clicking a row fixes it

我相信我已在我的NSTextField所有适当的自动布局限制,我使用了定制的子类,以及(从helpful answer here):

class FancyField: NSTextField{
  override var intrinsicContentSize: NSSize {
    // Guard the cell exists and wraps
    guard let cell = self.cell, cell.wraps else {return super.intrinsicContentSize}

    // Use intrinsic width to jibe with autolayout
    let width = super.intrinsicContentSize.width

    // Set the frame height to a reasonable number
    self.frame.size.height = 150.0

    // Calcuate height
    let height = cell.cellSize(forBounds: self.frame).height

    return NSMakeSize(width, height)
  }

  override func textDidChange(_ notification: Notification) {
    super.textDidChange(notification)
    super.invalidateIntrinsicContentSize()
  }
}

⭐️Here是一个样本项目:https://d.pr/f/90CTEh

我在茫然,还有什么我可以试试。有任何想法吗?

autolayout nstableview nstextfield appkit
1个回答
2
投票

我认为这是在界面生成器的约束的一些基本问题。调整窗口的大小使一切都靠不住。此外,你应该在你validateEditing()textDidChange(forBounds:)调用FancyField。我创建了一个示例项目,已经做了你想要的Github什么

写评论,如果你有任何问题。

思考一点点吧,以为我会在这里添加代码的肉。只有真正需要工作的事情,是对的NSTextField更新时,“任务”正在更新。以下是对的NSTextField所需的代码。

public class DynamicTextField: NSTextField {
   public override var intrinsicContentSize: NSSize {
      if cell!.wraps {
         let fictionalBounds = NSRect(x: bounds.minX, y: bounds.minY, width: bounds.width, height: CGFloat.greatestFiniteMagnitude)
         return cell!.cellSize(forBounds: fictionalBounds)
      } else {
         return super.intrinsicContentSize
      }
   }

   public override func textDidChange(_ notification: Notification) {
      super.textDidChange(notification)

      if cell!.wraps {
         validatingEditing()
         invalidateIntrinsicContentSize()
      }
   }
}

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.