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
工作,但我还没有尝试过呢。