【问题标题】:focus a NSTextField聚焦一个 NSTextField
【发布时间】:2009-04-18 20:51:12
【问题描述】:

我有一个 NSTextField,如果我点击一个按钮,我想设置它的内容,而不是将光标设置在文本末尾的这个文本字段上,这样如果有人点击了这个按钮,他就可以开始输入了。

直到现在我使用 [NSTextField selectText] 它选择了这个文本字段,但它选择了整个文本,所以如果有人刚刚开始输入,他会丢失文本字段中已经存在的所有文本。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    甚至更简单

    [yourTextField becomeFirstResponder];
    

    【讨论】:

    • 这样做的问题是这会选择所有文本,如果您开始键入预填充的文本将被覆盖,我想将光标设置在文本后面。
    • 此方法在 10.5 中已弃用,此外,如果您阅读此方法的文档,它会非常清楚地说明“永远不要直接调用此方法。”
    • 好点,Alan,我刚刚使用 10.8 SDK 删除了一些直接使用 becomeFirstResponder 引发异常的调用。
    【解决方案2】:

    好的,我现在发现了:)

    - (IBAction)focusInputField:(id)sender {
        [textField selectText:self];
        [[textField currentEditor] setSelectedRange:NSMakeRange([[textField stringValue] length], 0)];  
    }
    

    在 RubyCocoa 中是:

    def select_input_field
        @input.selectText self
        range = OSX::NSRange.new(@input.stringValue.length, 0)
        @input.currentEditor.setSelectedRange range
    end
    

    【讨论】:

      【解决方案3】:

      你会想做这样的事情:

      [[self window] makeFirstResponder:[self yourTextField]];
      

      【讨论】:

      • 这也选择了文本:-/
      【解决方案4】:

      我正在写一个游戏插件,我遇到了类似的问题:

      - (void)gotEvent:(NSEvent *)newEvent
      {
        [mainWindow makeKeyAndOrderFront:self];
        [mainWindow makeFirstResponder:messageField];
        [mainWindow sendEvent:newEvent]; // will forward the typing event
      }
      

      这样就可以了 :)

      【讨论】:

      • 你从哪里调用 gotEvent?
      【解决方案5】:

      前段时间我做过类似的任务。我的解决方案是为 NSTextField 的部分文本选择写下小类别方法。此方法的作用与原始 selectText: 类似(将焦点设置为控制)。

      @implementation NSTextField( SelExt )
      
      -(void)selectTextRange:(NSRange)range
      {
         NSText *textEditor = [self.window fieldEditor:YES forObject:self];
         if( textEditor ){
            id cell = [self selectedCell];
            [cell selectWithFrame:[self bounds] inView:self 
                  editor:textEditor delegate:self
                  start:range.location length:range.length];
         }
      }
      
      @end
      

      使用这种方法,您可以将文本选择放置在您想要的位置,然后立即开始输入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多