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

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

58329 次浏览

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

[textField becomeFirstResponder]

如果你指的是如何在 uitextfield 中获取文本,那么下面的例子可以做到:

textField.text

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

SelectAll

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

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

我只是测试这个来验证上面 Mirko 的注释,但是我的测试验证了 selectAll:在发送到 UITextField 本身时确实选择了所有的文本。

请注意,文本将立即被削减 | 复制 | 粘贴操作模糊,但对于您的问题,它正是出现时,用户点击“选择全部”开始。

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

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

这就是我的秘诀:

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

相当难看,但它工作,所以将不会有共享菜单控制器显示!

要解决“每两次只能工作一次”的问题,请使用以下方法:

__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];
});

感谢埃里克 · 贝克(刚刚在这里编辑了评论)

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)];

成交!

事实证明,调用-selectAll: 使用非 nil sender 会显示菜单。使用 nil 调用它会导致它选择文本,但不显示菜单。

在我的 bug 报告从苹果回来之后,我尝试了这个方法,并建议我通过 nil 而不是 self。

不需要使用 UIMenuController 或其他选择 API。

用你需要的

目的

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

我创建了一个自定义警报视图,其中包含一个 UITextField内。我发现 textfield 的一个问题是: 如果 textfield 被添加到 screen 并且 becomeFirstResponder被调用,那么 beginningOfDocument只有值。

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

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

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

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

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


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

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

斯威夫特

选择 UITextField中的所有文本:

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

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

这是我找到的最好的解决方案,没有共享的 MenuController,它可以连续工作:

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

斯威夫特3:

textField.selectAll(self)