以编程方式取消选择NSTextView中的文本?

时间:2011-11-21 00:36:17

标签: cocoa nstextview appkit

我正在使用以下代码取消选择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];

关于为什么这不起作用的任何想法?我确信我的插座设置正确,因为我可以操纵其他东西,比如它的字符串值。

6 个答案:

答案 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];