我为我的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];
}
}
但是,它有同样的问题。
有什么建议吗?
答案 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)
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
,但我还没有尝试过。