当NSTextField变为焦点时设置selectedRange

问题描述 投票:0回答:2

我压倒becomeFirstResponder知道我的NSTextField何时聚焦。一旦聚焦,我试图将光标移动到最后。以下代码段不起作用:

@interface MyTextField : NSTextField
@end

@implementation MyTextField

- (BOOL)becomeFirstResponder
{
  if ([super becomeFirstResponder]) {
    self.currentEditor.selectedRange = NSMakeRange(self.stringValue.length, 0);
    return YES;
  }
  return NO;
}

@end

通过重写textView:didChangeSelection:,我发现选择已经完成,但它会被一些响应NSEventTypeLeftMouseDown事件而运行的内部代码覆盖。

日志看起来像这样:

location=0, length=25

location=25, length=0 // The desired selection.

location=0, length=0

location=5, length=0 // Where the user clicked.
macos cocoa nstextfield appkit
2个回答
0
投票

覆盖mouseDown:子类中的NSTextField方法。

然后,在调用super之后设置selectedRange

- (void)mouseDown:(NSEvent *)event
{
  [super mouseDown:event];
  self.currentEditor.selectedRange = NSMakeRange(self.stringValue.length, 0);
}

NSTextField只有在其“场编辑器”尚未聚焦时调用其mouseDown:方法,因此用户仍然可以在NSTextField获得焦点后更改选择。

这不是一个完美的解决方案,因为用户可能间接地聚焦了NSTextField(例如:使用Tab键)。你总是可以在selectedRangemouseDown:中设置becomeFirstResponder


0
投票

使用performSelector:withObject:afterDelay:内部的becomeFirstResponder确保在处理selectedRange事件后设置NSEventTypeLeftMouseDown

- (BOOL)becomeFirstResponder
{
  if ([super becomeFirstResponder]) {
    [self performSelector:@selector(textFieldDidFocus) withObject:nil afterDelay:0.0];
    return YES;
  }
  return NO;
}

- (void)textFieldDidFocus
{
  self.currentEditor.selectedRange = NSMakeRange(self.stringValue.length, 0);
}
© www.soinside.com 2019 - 2024. All rights reserved.