ios - UITextView selectAll 方法未按预期工作

标签 ios objective-c uitextview selectall

我正在为我的 iPhone 5(上面装有 iOS 8.0.2)使用 Xcode 6.0.1 创建一个 iOS 8 应用程序。我想做到这一点,以便当用户点击我的 UITextView 时,所有文本都会被选中,这样他就可以轻松地开始输入并删除那里的内容(但我不希望文本自动删除,因为用户可能想保留它或附加到它)。为此,我有以下代码:

- (void)textViewDidBeginEditing:(UITextView *)textView {
    if ([textView hasText]) {
        NSLog(@"selectedRange before: %d", textView.selectedRange.length);
        [textView selectAll:self];
        NSLog(@"selectedRange after: %d", textView.selectedRange.length);
    }
}

调用此方法时,控制台输出是我所期望的(即 selectedRange 长度与 textView 文本中的字符数相同) .但是,在 UITextView 中没有显示为选中状态,并且它没有被选中(即没有弹出选择菜单)。

我在互联网上看到过多个类似的问题,但所提供的解决方案都不适合我(其中一些人将其作为错误注销,但没有提供任何解决方案)。将发件人 ID 更改为 self 以外的其他内容(例如 nil)没有帮助,调用 [textView select:self] 正如一个人所建议的那样。我也试过这段代码:

- (void)textViewDidBeginEditing:(UITextView *)textView {
    if ([textView hasText]) {
        UITextRange *range = [textView textRangeFromPosition:textView.beginningOfDocument toPosition:textView.endOfDocument];
        [textView setSelectedTextRange:range];
    }
}

但是,它也有同样的问题。

有什么建议吗?

最佳答案

这个解决方案也有效,不需要子类化 UITextView,只需将这个函数放在你的委托(delegate)上:

Objective-C -

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
  dispatch_async(dispatch_get_main_queue(), ^{
    [textView selectAll:nil];
  });
  return YES;
}

swift 3 -

func textViewDidBeginEditing(_ textView: UITextView) {
    DispatchQueue.main.async {
        textView.selectAll(nil)
    }
}

关于ios - UITextView selectAll 方法未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26307436/

相关文章:

ios - UITextView 观察文字变化

iphone - 禁用纵向模式

iphone - iOS:如何让两个 UIView 自动填充空间?

ios - 定义常量字典 Objective-C

ios - 为什么我的 NSString 不适合使用我的 NSString 宽度创建的框架?

ios - 在 UITextView.text 中确定单词并使用 Swift 2.2、iOS 9.3 和 Xcode 7 修改带有前缀的单词的方法?

iOS:GUI 自动化测试和持续集成

ios - 我怎样才能在我的 UIImageView 上实现这种效果(圆角、内发光)?

iphone - 如何将 nil-terminated 字符串列表传递给 Objective-C 函数?

iOS 播放 iTunes 库中的文件并在运行时修改样本