5

我试图确定,哪个特定的角色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

4 回答 4

8

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

作为一种解决方法,您可以事先调用setSelectedRange:or ,但随后会突出显示您的选择。我想出了以下解决方案:setSelectedTextRange:textView

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

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

请注意,您只需要在之后调用一次textView初始化后调用一次。

编辑:我的答案从“除非事先选择了一些文本”编辑为“除非当前选择了一些文本”。这是错误的:当前不需要选择文本,只需选择一次。如我的说明所述,所有后续调用都setSelectedRange:将成功。为进一步清晰而重新编辑。

于 2013-11-02T22:40:14.587 回答
5

您的 UITextView 必须是可选择的。在情节提要中,选中“可选”复选框。

在代码中,

textView.selectable = YES;

这也是-closestPositionToPoint:UITextView 上的方法所必需的。

于 2014-03-10T19:39:40.047 回答
0

使用 shouldChangeCharactersInRange 方法而不是 characterRangeAtPoint。

并使用您的 If 条件代替循环语句。

于 2013-09-21T05:57:47.560 回答
0

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

我在这里的假设是您想要角色相对于角色数量的位置,而不是二维坐标。

于 2013-09-21T06:03:16.423 回答