【问题标题】:Detecting tapped character. UITextView characterRangeAtPoint always returns nil检测被敲击的字符。 UITextView characterRangeAtPoint 总是返回 nil
【发布时间】:2013-09-20 20:58:02
【问题描述】:

我正在尝试确定UITextView 中的哪个特定字符已被窃听。我尝试使用characterRangeAtPoint: 方法。但它总是返回零,无论我在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 字符串。 我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      在代码中,

      textView.selectable = YES;
      

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

      【讨论】:

        【解决方案3】:

        使用 shouldChangeCharactersInRange 方法代替 characterRangeAtPoint。

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

        【讨论】:

        • 抱歉,我没看出来, shouldChangeCharactersInRange 如何帮助我找到触摸坐标和字符范围之间的依赖关系。
        【解决方案4】:

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

        我在这里的假设是你想要角色的位置相对于角色的数量,而不是 2D 中的坐标。

        【讨论】:

        • 不,我的意图是覆盖原生选择行为。所以我需要从 CGPoint 映射到 UITextRange(或 NSRange,等等)。
        猜你喜欢
        • 2014-07-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 2017-03-28
        • 2015-03-05
        • 2014-08-25
        • 2016-05-17
        相关资源
        最近更新 更多