【问题标题】:How to make a NSTextView, that is added programmatically, active?如何使以编程方式添加的 NSTextView 处于活动状态?
【发布时间】:2020-10-19 23:53:12
【问题描述】:

我正在制作一个应用程序,用户可以在其中单击窗口上的任意位置,并在鼠标位置添加NSTextView。我已经让它与下面的代码一起工作,但在将它添加到视图(父视图)后,我无法使其处于活动状态(焦点)。我必须点击NSTextView 才能激活它,但这不是我想要的。我希望它在添加到父视图时自动变为活动状态。

在我的ViewController 中添加代码以将NSTextView 添加到其视图中:

private func addText(at point: NSPoint) {     
    let textView = MyTextView(frame: NSRect(origin: point, size: CGSize(width: 150.0, height: 40.0)))
    view.addSubview(textView)       
}

MyTextView 类如下所示:

class MyTextView: NSTextView {
    
    override var shouldDrawInsertionPoint: Bool {
        true
    }
    
    override var canBecomeKeyView: Bool {
        true
    }

    override func viewWillDraw() {
        
        isHorizontallyResizable = true
        isVerticallyResizable = true
        
        insertionPointColor = .red
        drawsBackground = false
        isRichText = false
        allowsUndo = true
        font = NSFont.systemFont(ofSize: 40.0)
        
    }
    
}

另外,我希望它在单击其他一些元素(视图)时失去焦点(变为非活动状态)。现在,一旦NSTextView 变为活动状态,无论我单击什么其他元素,它都会保持活动状态,除非我单击空白空间以创建另一个NSTextView

我已经多次阅读 Apple 文档,但我认为我遗漏了一些东西。任何帮助将不胜感激。

【问题讨论】:

    标签: swift macos cocoa appkit nstextview


    【解决方案1】:

    获取NSViewControllerviewNSWindow 实例并调用makeFirstResponder,将文本视图作为参数传递。

    失去焦点呼叫makeFirstResponder 传递nil

    【讨论】:

    • 这行得通,谢谢!所以,我想我也会这样做以从NSTextView 中失去焦点?那就是当我单击其他元素时,我将调用makeFirstResponder 传递最近单击的元素。还是有更好的办法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多