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

时间:2009-11-06 19:45:46

标签: ios swift uitextfield uikit

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

12 个答案:

答案 0 :(得分:81)

这就是我的诀窍:

[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(刚刚在这里评论编辑)

答案 1 :(得分:48)

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

请注意,文本将立即被CUT |隐藏COPY | PASTE操作,但对于您的问题,它恰好是用户点击“全选”开始时显示的内容。

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

[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;

答案 2 :(得分:48)

原来,调用-selectAll:使用非零发件人显示菜单。用nil调用它会使它选择文本,但不显示菜单。

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

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

答案 3 :(得分:38)

使用您需要的

<强> ObjC

 [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)

答案 4 :(得分:8)

<强>夫特

选择UITextField中的所有文字:

textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)

我的完整答案是here

答案 5 :(得分:7)

这是我发现的最佳解决方案。没有sharedMenuController,它连续工作:

    -(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [textField performSelector:@selector(selectAll:) withObject:nil afterDelay:0.1];
}

答案 6 :(得分: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:不显示菜单。

答案 7 :(得分:2)

不幸的是,我不认为你能做到这一点。

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

答案 8 :(得分:2)

斯威夫特3:

textField.selectAll(self)

答案 9 :(得分:1)

我创建了一个自定义警报视图,里面包含UITextField。我发现文本域存在一个问题:beginningOfDocument只有将textfield添加到screen&amp; becomeFirstResponder被称为。{/ p>

否则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!!!

答案 10 :(得分: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)];

完成!

答案 11 :(得分:-1)

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

[textField becomeFirstResponder]

如果你的意思是如何获得uitextfield中的文本而不是这样:

textField.text

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

selectAll