UITextView selectAll方法无法按预期工作

Eth*_*n G 10 selectall objective-c uitextview ios

我正在为我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用此方法时,控制台输出是我所期望的(即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];
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,它有同样的问题.

有什么建议?

bre*_*tne 25

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

目标C -

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

SWIFT 3 -

func textViewDidBeginEditing(_ textView: UITextView) {
    DispatchQueue.main.async {
        textView.selectAll(nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案非常荒谬.这也是100%正确的! (4认同)

小智 5

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

func textViewShouldBeginEditing(textView: UITextView) -> Bool {
    dispatch_async(dispatch_get_main_queue()) {
        textView.selectAll(nil)
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)


Eth*_*n G 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];
}
Run Code Online (Sandbox Code Playgroud)

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