代码之家  ›  专栏  ›  技术社区  ›  Clifton Labrum

在MacOS应用程序的InstableView行中,高度可变的可编辑nstextfields

  •  0
  • Clifton Labrum  · 技术社区  · 7 年前

    Xcode 10.1、Swift 4.2、MacOS 10.14.2

    我正在尝试为MacOS制作一个简单的待办事项列表应用程序,其中有一系列 NSTableView 每一行中都有一个 NSTextField . 每个字段都是待办事项。我想要 非稳定视图 要展开的行以适应每个行中文本的大小 NSTEXT字段 .

    我有以下所有工作:

    1. 在中设置文本 NSTEXT字段 使 非稳定视图 行根据需要展开。自动布局约束在我的故事板中设置。
    2. 使用 tableView.reloadData(forRowIndexes: ..., columnIndexes: ...) 设置文本并正确调整表格行的大小。 reloadData works 但做 tableView.reloadData() 总是重置间隔 NSTEXT字段 到一行文本,如下所示: reloadData fails 有趣的是,如果你点击 NSTEXT字段 重新加载整个表后,字段将重新调整大小以适应其内容: Clicking a row fixes it

    我相信我已经在我的 NSTEXT字段 我也在为它使用自定义子类(从 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()
      }
    }
    

    ___这是一个示例项目: https://d.pr/f/90CTEh

    我不知道还能做些什么。有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   TimTwoToes    7 年前

    我认为接口生成器中的约束存在一些基本问题。调整窗口的大小会使一切变得不稳定。你也应该打电话 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()
          }
       }
    }
    

    希望它有帮助。