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

Mir*_*rko 69 uitextfield uikit ios swift

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

bla*_*boy 82

这就是我的诀窍:

[self.titleField setSelectedTextRange:[self.titleField textRangeFromPosition:self.titleField.beginningOfDocument toPosition:self.titleField.endOfDocument]];
Run Code Online (Sandbox Code Playgroud)

相当难看,但它的工作原理,所以不会显示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];
});
Run Code Online (Sandbox Code Playgroud)

感谢Eric Baker(刚刚在这里评论编辑)

  • @LeonNguyen这对我来说可以解决你描述的问题:`__ 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];});` (11认同)
  • 这实际上是对这个问题的最优答案.它没有任何愚蠢的变通方法就可以防止显示菜单(这对我来说无效). (3认同)

Ric*_*ick 52

事实证明,调用-selectAll:使用非零发件人显示菜单.用nil调用它会使它选择文本,但不显示菜单.

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

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

  • 我一直试图弄清楚如何在不显示菜单的情况下选择文本.谢谢你添加tid-bit. (3认同)
  • 忘了它,对于警报控制器这个答案有效:http://stackoverflow.com/a/35992115/433373 (3认同)

Jus*_*rls 48

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

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

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

[_myTextField selectAll:self];
[UIMenuController sharedMenuController].menuVisible = NO;
Run Code Online (Sandbox Code Playgroud)

  • 实际上,要选择所有文本以便菜单不显示,您必须使用`setSelectedRange:`. (3认同)

Ted*_*Ted 40

使用你需要的

 [yourtextField becomeFirstResponder]; //puts cursor on text field

 [yourtextField selectAll:nil];  //highlights text

 [yourtextField selectAll:self]; //highlights text and shows menu(cut copy paste)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果要在首次显示视图时选择文本,则必须将`selectAll`调用放在`viewDidAppear`中.放在`viewDidLoad`或`viewWillAppear`中时它不起作用. (4认同)
  • 这里最好的答案.超级简单,隐藏Cut/Copy/Pate弹出窗口的'nil'技巧就可以了! (3认同)

Sur*_*gch 8

迅速

选择以下所有文字UITextField:

textField.selectedTextRange = textField.textRangeFromPosition(textField.beginningOfDocument, toPosition: textField.endOfDocument)
Run Code Online (Sandbox Code Playgroud)

我的完整答案就在这里.


小智 7

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

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

  • 谢谢!这种方法,或者说是与Swift等效的“ textField.perform(#selector(selectAll),带有:nil,afterDelay:0.01)”,解决了Leon Nguyen在blackforestcowboy上面的回答中遇到的问题,该问题只能每隔一段时间运行一次。关于延迟操作的某些事情必须理清线程。正如@ToolmakerSteve所说,在此处的答案中进行解释将很有用。 (2认同)