我正在为我的 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/