是否有任何方法可以阻止NSTokenField在按ENTER键时选择所有内容,或者当使用TAB键向第一个响应者发送时?
NSTokenField是NSTextField的子类.直接操作这些类的选择没有简单直接的方法(除了-selectText:,它选择全部).
要在它成为第一个响应者时执行此操作,您需要子类化NSTokenField(记住将XIB中的字段类设置为自定义子类的字段)并覆盖-becomeFirstResponder,如下所示:
- (BOOL)becomeFirstResponder
{
if ([super becomeFirstResponder])
{
// If super became first responder, we can get the
// field editor and manipulate its selection directly
NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self];
[fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)];
return YES;
}
return NO;
}
Run Code Online (Sandbox Code Playgroud)
此代码首先查看super是否回答"是"(并成为第一个响应者).如果是,我们知道它将有一个字段编辑器(NSText实例),我们可以直接操作它们的选择.所以我们得到它的字段编辑器并设置它的选定范围(我将插入点放在最后一个{lastchar,nolength}范围内).
要在字段完成编辑(返回,跳出等)时执行此操作,请覆盖-textDidEndEditing:如下所示:
- (void)textDidEndEditing:(NSNotification *)aNotification
{
[super textDidEndEditing:aNotification];
NSText * fieldEditor = [[self window] fieldEditor:YES forObject:self];
[fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length], 0)];
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当用户结束编辑时,此方法让super执行其操作,然后查看它是否仍然是第一个响应者.如果是,它与上面相同:将插入克拉放在字段的末尾.
请注意,此行为不是标准的,并且是意外的.谨慎使用.
归档时间: |
|
查看次数: |
1399 次 |
最近记录: |