我压倒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.
覆盖mouseDown:
子类中的NSTextField
方法。
然后,在调用super之后设置selectedRange
。
- (void)mouseDown:(NSEvent *)event
{
[super mouseDown:event];
self.currentEditor.selectedRange = NSMakeRange(self.stringValue.length, 0);
}
NSTextField
只有在其“场编辑器”尚未聚焦时调用其mouseDown:
方法,因此用户仍然可以在NSTextField
获得焦点后更改选择。
这不是一个完美的解决方案,因为用户可能间接地聚焦了NSTextField
(例如:使用Tab键)。你总是可以在selectedRange
和mouseDown:
中设置becomeFirstResponder
。
使用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);
}