UITextView selectAll方法不按预期工作

我正在为我的iPhone 5(其上有iOS 8.0.2)创build一个iOS 8应用程序。 我想这样做,当用户点击我的UITextView ,所有的文本被选中,所以他可以很容易地开始input和擦除那里(但我不希望文本被自动擦除,因为用户可能想要保留或附加到它)。 为此,我有以下代码:

 - (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没有显示出任何内容,并且它没有被选中(即没有select菜单popup)。

我在网上看到了类似这样的多个问题,但是没有一个提供的解决scheme为我工作 (其中一些解决scheme没有提供任何解决scheme就把它当作bug)。 如果将发件人ID更改为除self (例如nil ),则不nil帮助,也不会像一个人所build议的那样调用[textView select:self] 。 我也试过这个代码:

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

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

有什么build议么?

这个解决scheme也可以工作,不需要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) } } 

@ brentvatne的解决scheme为我工作。 发布Swift语法,以便将来可以复制和粘贴。

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

到目前为止,我发现这个问题的最好的解决scheme是创build一个自定义的UITextView (即创build一个新的类,扩展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]; } 

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