12

我正在为我的 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);
    }
}

当调用此方法时,控制台输出是我所期望的(即长度与's 文本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];
    }
}

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

有什么建议么?

4

3 回答 3

33

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

目标 C -

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

斯威夫特 3 -

func textViewDidBeginEditing(_ textView: UITextView) {
    DispatchQueue.main.async {
        textView.selectAll(nil)
    }
}
于 2015-04-29T01:28:48.147 回答
4

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

func textViewShouldBeginEditing(textView: UITextView) -> Bool {
    dispatch_async(dispatch_get_main_queue()) {
        textView.selectAll(nil)
    }
    return true
}
于 2015-11-13T01:21:24.280 回答
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,但我还没有尝试过。

于 2014-11-28T18:31:29.500 回答