【问题标题】:How to find which NSTextfield is focused如何找到重点关注的 NSTextfield
【发布时间】:2011-06-24 08:14:22
【问题描述】:

我在找出哪个 NSTextfield 被关注时遇到了问题。

我正在构建一个多语言表单,并有几个NSTextfields 用于数据输入。我必须在数据输入期间更改某些NSTextfields 的文本输入源,并且我需要它自动发生。

现在,我可以毫无问题地更改我提到的here 的文本输入源。

我遇到的问题是在NSTextfield 成为焦点时更改输入源。如果我使用controlTextDidBeginEditing: 委托方法,它会在输入第一个字母后更改源输入。 这意味着我丢失了我用正确语言输入的第一个单词。

有没有委托人找到它?

【问题讨论】:

    标签: objective-c cocoa macos delegates nstextfield


    【解决方案1】:

    您可以继承您的 NSTextField 并覆盖 - (BOOL)becomeFirstResponder (NSResponder) 以响应此类事件。

    你也可以试试control:textShouldBeginEditing:。

    【讨论】:

    • @AliSoftware,不,对不起我的朋友,但control:textShouldBeginEditing 的工作方式类似于controlTextDidBeginEditing: 方法!两者都不适合我!我需要在输入任何内容之前更改 input source (在选择文本字段之后),并且两种方法都会在 start typing 之后更改 input source 。这意味着我会丢失第一个字母(就像我一样)。
    • @AliSoftware,并且 becomeFirstResponder 在 Mac OSx 10.0 到 Mac OSx 10.4 中可用,我使用的是 Mac OSx 10.6。
    • becomeFirstResponder 从 10.0 开始可用,并且从未从 API 中删除,因此它在 10.6 中仍然可用(希望!!)。请参阅documentation。我只是在一个仅限 10.6 的项目上亲自尝试过,以确认这一点,它就像一个魅力。
    • 您回答中的文档是关于 NSTextView 而不是 NSTextField。 NSTextView 有自己的becomeFirstResponder 实现(正如您在文档中看到的,此方法直接在 NSTextField 的文档中定义,并且与 NSResponder 的becomeFirstResponder 方法不同),这是已弃用的方法。来自 NSResponder 的那个(我之前给出了文档的链接)没有被弃用,在 10.6 中仍然可用
    • @interface MyTextField : NSTextField @end @implementation MyTextField -(BOOL)becomeFirstResponder { NSLog(@"textField %@ 确实获得了焦点。",self); // 您在这里更改数据源的代码 return [super becomeFirstResponder];然后将您的 XIB 文件中的 NSTextField 对象的类更改为 MyTextField
    【解决方案2】:

    你需要继承NSTextField

    Swift 3+

    class FocusingTextField : NSTextField {
    
        var isFocused : Bool = false
    
        override func becomeFirstResponder() -> Bool {
            let orig = super.becomeFirstResponder()
            if(orig) { self.isFocused = true }
            return orig
        }
    
        override func textDidEndEditing(_ notification: Notification) {
            super.textDidEndEditing(notification)
            self.isFocused = false
        }
    
        override func selectText(_ sender: Any?) {
            super.selectText(sender)
            self.isFocused = true
        }
    
    }
    

    您的视图控制器中的self.view.window?.firstResponder 会给出NSTextView

    【讨论】:

      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多