76

如何以编程方式选择 UITextField 中的所有文本?

4

12 回答 12

84

这就是我的诀窍:

[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];

非常难看,但它可以工作,所以不会显示 sharedMenuController !

要解决“仅每秒钟有效”问题,请使用以下命令:

__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    UITextRange *range = [strongSelf textRangeFromPosition:strongSelf.beginningOfDocument toPosition:strongSelf.endOfDocument];
    [strongSelf setSelectedTextRange:range];
});

感谢 Eric Baker(刚刚从这里的评论中编辑)

于 2013-05-28T22:39:15.780 回答
61

结果是,调用 -selectAll: 与非零发送者显示菜单。用 nil 调用它会导致它选择文本,但不显示菜单。

在我的错误报告从 Apple 回来后,我尝试了这个,建议我通过 nil 而不是 self。

无需使用 UIMenuController 或其他选择 API。

于 2014-02-12T00:32:11.197 回答
48

我刚刚对此进行了测试以验证 Mirko 上面的评论,但我的测试验证selectAll:了当它被发送到 UITextField 本身时确实选择了所有文本。

请注意,文本将立即被 CUT | 遮挡​​。复制 | 粘贴操作,但对于您的问题,这正是用户点击“全选”开始时出现的内容。

我要使用的解决方案如下,请注意第二行将暂时隐藏 CUT/COPY/PASTE 对话框,而不会为明确的用户选择禁用它

[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
于 2010-01-31T18:43:50.433 回答
48

使用你需要的东西

对象

[yourtextField becomeFirstResponder]; //puts cursor on text field
[yourtextField selectAll:nil];  //highlights text
[yourtextField selectAll:self]; //highlights text and shows menu(cut copy paste)

迅速

yourTextField.becomeFirstResponder() //puts cursor on text field
yourTextField.selectAll(nil)  //highlights text
yourTextField.selectAll(self) //highlights text and shows menu(cut copy paste)
于 2014-08-01T01:53:15.630 回答
9

这是我找到的最好的解决方案。没有 sharedMenuController,它连续工作:

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}
于 2016-12-09T21:19:51.253 回答
8

迅速

选择 a 中的所有文本UITextField

textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)

我的完整答案在这里:https ://stackoverflow.com/a/34922332/3681880

于 2016-01-21T11:40:27.353 回答
3

为了能够选择文本,文本字段必须是可编辑的。要知道文本字段何时可编辑,请使用委托方法:

- (void)textFieldDidBeginEditing:(UITextField *)textField
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

我不认为 textFieldShouldBeginEditing: 是必需的,但这是我在实现中使用的。

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [textField selectAll:textField];
}

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return YES;
}

将 nil 传递给 selectAll: 不会显示菜单。

于 2015-02-05T16:54:14.983 回答
2

不幸的是,我认为你做不到。

我不确定这是否对您有帮助,但setClearsOnBeginEditing允许您指定UITextField在用户开始编辑时应该删除现有值(这是安全的默认值UITextFields)。

于 2009-11-09T20:58:09.003 回答
2

斯威夫特 3:

textField.selectAll(self)
于 2017-09-01T15:22:28.597 回答
1

我创建了一个包含UITextField内部的自定义警报视图。我发现文本字段的一个问题是:beginningOfDocument只有在将文本字段添加到屏幕&becomeFirstResponder被调用时才有价值。

否则beginningOfDocument返回nil[UITextField textRangeFromPosition:]无法获取值。

所以这是我解决这种情况的示例代码。

UIWindow *window = [[[UIApplication sharedApplication] windows] firstObject];
[window addSubview:theAlertView]; // textfield must be added as a subview of screen first
UITextField *textField = theAlertView.textField;
[textField becomeFirstResponder]; // then call to show keyboard and cursor 
UITextRange *range = [textField textRangeFromPosition:textField.beginningOfDocument toPosition:textField.endOfDocument]; // at this time, we could get beginningOfDocument
[textField setSelectedTextRange:range]; // Finally, it works!!!
于 2015-02-05T11:36:48.507 回答
0
UITextField *tf = yourTF;
// hide cursor (you have store default color!!!)
[[tf valueForKey:@"textInputTraits"] setValue:[UIColor clearColor]
                                       forKey:@"insertionPointColor"];
// enable selection
[tf selectAll:self];
// insert your string here
// and select nothing (!!!)
[tf setMarkedText:@"Egor"
    selectedRange:NSMakeRange(0, 0)];

完毕!

于 2013-11-29T20:33:20.743 回答
-1

如果您的意思是如何允许用户编辑 uitextfield 中的文本,那么只需将 firstResponder 分配给它:

[textField becomeFirstResponder]

如果您的意思是如何获取 uitextfield 中的文本,则可以这样做:

textField.text

如果您的意思是实际选择文本(如突出显示它),那么这可能会很有用:

全选

于 2009-11-06T19:50:06.823 回答