检测点击的字符。 UITextView characterRangeAtPoint始终返回nil

时间:2013-09-20 20:58:03

标签: iphone ios objective-c uikit core-text

我正在尝试确定UITextView中的哪个特定字符已被点击。我尝试使用characterRangeAtPoint:方法。但它始终返回nil,无论我在UITextView点击哪里。 我甚至编写并运行了以下代码:

for (int x = 0; x<1000; x++) {
    pos.x = x;
    for (int y = 0; y<1000; y++) {
        pos.y = y;
        UITextRange * range = [textView characterRangeAtPoint:pos];
        if (range!=nil) {
            NSLog(@"x: %f, y: %f", pos.x, pos.y);
        }
    }
}

好吧,它永远不会到达NSLog字符串。 我做错了什么?

4 个答案:

答案 0 :(得分:8)

这是一个iOS 7错误。 characterRangeAtPoint:始终返回nil,除非事先至少选择过一次文本。

作为一种变通方法,您可以事先致电setSelectedRange:setSelectedTextRange:,但textView会突出显示您的选择。我提出了以下解决方案:

[textView select:textView];
[textView setSelectedTextRange:nil];

调用这两种方法后,characterRangeAtPoint:将按预期开始工作。

请注意,您只需在textView初始化后再拨打一次。

编辑:我的答案是从“编辑的,除非事先选择了一些文字”“,除非当前选择了某些文字”。这是错误的:当前不需要选择文本,只需选择一次。如我所述,随后对setSelectedRange:的所有来电都将成功。为了进一步澄清而进行了编辑。

答案 1 :(得分:5)

您的UITextView必须是可选的。在故事板中,选中&#34; Selectable&#34;复选框。

在代码中,

textView.selectable = YES;

UITextView上的-closestPositionToPoint:方法也需要这样做。

答案 2 :(得分:0)

使用shouldChangeCharactersInRange方法而不是characterRangeAtPoint。

并在循环语句中使用If条件。

答案 3 :(得分:0)

您的TextView是否可由用户编辑? 如果是,则尝试texViewDidChangeSelection方法。每次在textView中移动插入符(光标)时都会调用它。然后通过textView.selectedRange.location获取光标位置以指向插入符号的索引。

我的假设是你想要角色的位置与角色的数量有关,而不是2D中的坐标。