我正在使用以下代码取消选择NSTextView
,如建议的here。不幸的是,什么也没发生。我已经尝试了我所知道的调试它,但一切似乎都正常,但它不会影响NSTextView
。
代码:
// Sets the scrolling bounds and behavior. This might be useful, but I don't know
[[textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)];
[[textView textContainer] setWidthTracksTextView:FALSE];
// The code for deselecting, beginning by making sure it is actually selected (for testing only, as strange as it is)
[textView setSelectable:TRUE];
[textView setDelegate:self];
[_window makeFirstResponder:textView];
NSText *fieldEditor = [_window fieldEditor:TRUE forObject:textView];
[fieldEditor setSelectedRange:NSMakeRange([[fieldEditor string] length],0)];
[fieldEditor setNeedsDisplay:YES];
关于为什么这不起作用的任何想法?我确信我的插座设置正确,因为我可以操纵其他东西,比如它的字符串值。
答案 0 :(得分:8)
我不确定NSTextViews是否使用字段编辑器,您是否尝试直接在文本视图上调用该方法?
[textView setSelectedRange:NSMakeRange(textView.string.length, 0)];
例如,可以调整范围位置以将光标移动到开头或结尾。在调用此方法之前,您可能还需要检查以确保实际选择了某些内容。
编辑:
从你的评论中听起来你只想让它辞职第一响应者。您可以通过拨打[textView.window makeFirstResponder:nil];
答案 1 :(得分:6)
这几乎对我有用;
[textView.window makeFirstResponder:nil];
但是,我将第一响应者设置为nil时遇到了麻烦。如果我将它设置为任何其他视图,它似乎按照您的意愿。
[textView.window makeFirstResponder:[textView superview]];
在10.7狮子座中测试过。
答案 2 :(得分:2)
我使用这种方法并且效果很好:
[textView setSelectedRange:NSMakeRange(0, 0)];
答案 3 :(得分:2)
如前所述,setSelectedRange:
会做出伎俩但
如果你的目标是完全删除选择和光标,f.e。如果您继承NSTextView
以支持NSTextEdit
之类的类似行为,如果firstResponder
状态发生变化,您应该写一下:
- (BOOL)resignFirstResponder
{
// Invalid range location will remove cursor too
[self setSelectedRange:NSMakeRange(NSUIntegerMax, 0)];
return YES;
}
//------------------------------------------------------------------------------
- (BOOL)becomeFirstResponder
{
[self setSelectedRange:NSMakeRange(0, self.string.length)];
return YES;
}
//------------------------------------------------------------------------------
答案 4 :(得分:-2)
[textView setDelegate:self];
我感觉你的一个委托方法阻止了事情的发生。请参阅“管理选择”下的documentation。
答案 5 :(得分:-2)
作为临时解决方案,只有在有人提出更好的想法之前,才能使用setHidden:
。我确信这不如推荐的那样有效,但它会取消选择NSTextView
。
只需将其切换两次,就像这样:
[textView setHidden:TRUE];
[textView setHidden:FALSE];