如何使用 NSControl 的编辑(withFrame:editor:delegate:event:)?

Posted

技术标签:

【中文标题】如何使用 NSControl 的编辑(withFrame:editor:delegate:event:)?【英文标题】:How to use NSControl's edit(withFrame:editor:delegate:event:)? 【发布时间】:2019-01-27 13:26:40 【问题描述】:

我有一个自定义 NSControl,我正在尝试让函数 edit(withFrame:editor:delegate:event:) 工作。调用它时,我希望字段编辑器会出现在我的视图中,但什么也没发生。

我已阅读该函数的文档,并创建了一个最小示例:

class MyView: NSControl, NSControlTextEditingDelegate, NSTextDelegate 
  required init?(coder: NSCoder) 
    super.init(coder: coder)
    isEnabled = true
  

  override func mouseDown(with event: NSEvent) 
    let editor = window!.fieldEditor(true, for: nil)!
    let rect = bounds.insetBy(dx: 10.0, dy: 10.0)
    self.edit(withFrame: rect, editor: editor, delegate: self, event: event)
  

  func control(_ control: NSControl, textShouldBeginEditing fieldEditor: NSText) -> Bool 
    return true
  

  func control(_ control: NSControl, textShouldEndEditing fieldEditor: NSText) -> Bool 
    self.endEditing(fieldEditor)
    return true
  

  func textShouldBeginEditing(_ textObject: NSText) -> Bool 
    return true
  

从示例中可以看出,我不太确定是遵循NSControlTextEditingDelegate 还是NSTextDelegate。我实现的函数似乎都没有被调用。

或者我可能误解了函数的目的?我应该覆盖它而不是调用它吗?

【问题讨论】:

【参考方案1】:

我不是字段编辑器方面的专家,但浏览 Apple 的文档似乎表明,它被设计为在控件 NSCell 类上实现并自己呈现文本。如果您希望字段编辑器出现在上面的示例中,您必须将字段编辑器插入到视图层次结构中。它不会自动发生。

class CustomTextControl: NSControl 
    override func mouseDown(with event: NSEvent) 
        // Make sure
        if currentEditor() == nil 
            if let controlWindow = window 
                if controlWindow.makeFirstResponder(controlWindow) 
                    // It is safe to claim the field editor
                    if let editor = controlWindow.fieldEditor(true, for: nil) as? NSTextView 
                        addSubview(editor)
                        editor.frame = bounds
                        edit(withFrame: bounds, editor: editor, delegate: nil, event: event)
                    
                 else 
                    // Some other control has first responder, force first responder to resign
                    controlWindow.endEditing(for: nil)
                
            
        
    

我建议您阅读 Apple 的 Cocoa Text Architecture Guide 文档。特别是Working with the Field Editor 和NSCell 文档。这是一项不平凡的任务。

我想知道你想达到什么目的。

【讨论】:

以上是关于如何使用 NSControl 的编辑(withFrame:editor:delegate:event:)?的主要内容,如果未能解决你的问题,请参考以下文章

NSControl 和 NSCell:以正确的方式管理单元状态

NSCell 和 NSControl 之间的关系/区别是啥?

OS X 10.10中的自定义NSControl类

NSControl对象中的日语字体呈现不正确

NSControl 的 setCellClass 在 OS X 10.10 中已弃用,有啥替代方法可以覆盖 NSTextField 的单元格类?

鼠标按下行为 NSControl 和 NSView 的第一响应者