UITextView selectAll方法无法按预期工作

时间:2014-10-10 20:18:37

标签: 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];
    }
}

但是,它有同样的问题。

有什么建议吗?

3 个答案:

答案 0 :(得分:25)

此解决方案也有效,并且不需要子类化UITextView,只需将此函数放在您的委托上:

目标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)
    }
}

答案 1 :(得分:4)

@brentvatne的解决方案对我有用。发布Swift语法,以便将来人们可以复制和粘贴。

func textViewShouldBeginEditing(textView: UITextView) -> Bool {
    dispatch_async(dispatch_get_main_queue()) {
        textView.selectAll(nil)
    }
    return true
}

答案 2 :(得分:3)

我目前为此问题找到的最佳解决方案是创建自定义UITextView(即创建一个扩展UITextView的新类),然后实现selectAll像这样的方法:

- (void)selectAll:(id)sender {
    [super selectAll:sender];
    UITextRange *selectionRange = [self textRangeFromPosition:self.beginningOfDocument toPosition:self.endOfDocument];
    [self performSelector:@selector(setSelectedTextRange:) withObject:selectionRange afterDelay:0.0];
}

然后,当您使用文本视图时,请将其类型设置为自定义文本视图类型(在代码和故事板中)。现在,您可以随时成功调用selectAll方法。我想这也适用于UITextField,但我还没有尝试过。