【问题标题】:Programmatically Select all text in UITextField以编程方式选择 UITextField 中的所有文本
【发布时间】:2010-12-13 23:29:14
【问题描述】:

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

【问题讨论】:

    标签: ios swift uitextfield uikit


    【解决方案1】:

    使用你需要的东西

    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)
    

    【讨论】:

    • 最佳答案在这里。超级简单,隐藏 Cut/Copy/Pate 弹出窗口的“nil”技巧就可以了!
    • 这是最好/最简单的答案
    • 注意如果你想在第一次显示视图时选择文本,你必须在viewDidAppear中调用selectAll。放在viewDidLoadviewWillAppear 时不起作用。
    【解决方案2】:

    斯威夫特

    选择UITextField中的所有文本:

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

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

    【讨论】:

    • 顺便说一句,如果有一个 Swift 等效于更短的替代解决方案 [textField selectAll:nil],也可以列出来。
    • 是的,如果有人知道,请发表评论。
    【解决方案3】:

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

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

    【讨论】:

    • 在提出问题多年后添加答案时,最好解释一下为什么您要添加另一个答案。这里有很多现有的答案:在什么情况下你的答案比所有这些都“更好”?有什么好处?在某些情况下它可能没有好处,那么您会使用什么现有答案?
    • 谢谢!这种方法,或者更确切地说是 Swift 等效的“textField.perform(#selector(selectAll), with: nil, afterDelay: 0.01)”,解决了 Leon Nguyen 在上面的 blackforestcowboy 的答案中遇到的问题,它每隔一段时间才有效。关于延迟动作的一些事情必须理清线程。正如@ToolmakerSteve 所说,在这里的答案中解释这一点会很有用。
    【解决方案4】:

    这就是我的诀窍:

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

    【讨论】:

    • 这实际上是对这个问题的一个更好的答案。它没有任何愚蠢的解决方法来防止显示菜单(这对我无论如何都不起作用)。
    • 很抱歉带回来,但您的解决方案只能在第一次使用。第二次,失败了。基本上,我所做的是,当用户单击 UITextField 时,选择所有文本以便他们可以覆盖所有文本,他们可以通过单击其他内容(在这种情况下为背景透明)来关闭键盘,然后单击相同的 UITextField 不会做这个把戏了。重复这个过程,我注意到它适用于奇数时间但不适用于偶数时间。即:适用于第一,第三,第五;不适用于第二、第四、第六。
    • @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]; });
    • @EricBaker 我可以确认您的解决方案有效。这似乎是线程的问题。谢谢
    • __weak / __strong hack 对我不起作用。我必须在 endEditing 时取消选择所有文本,以便在 startEditing 时重新选择它。
    【解决方案5】:

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

    [textField becomeFirstResponder]
    

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

    textField.text
    

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

    selectAll

    【讨论】:

    • 实际上我想以编程方式选择所有文本(突出显示),就像用户点击一次文本然后点击“全选”时一样
    • 最后一个方法就是你想要的。
    • 其实不是:当用户点击编辑菜单的全选命令时调用该方法。我想要的是调用全选,就像用户点击全选命令一样。
    【解决方案6】:

    斯威夫特 3:

    textField.selectAll(self)
    

    【讨论】:

      【解决方案7】:

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

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

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

      - (void)textFieldDidBeginEditing:(UITextField *)textField{
          [textField selectAll:textField];
      }
      
      - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
          return YES;
      }
      

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

      【讨论】:

        【解决方案8】:

        我创建了一个自定义警报视图,其中包含一个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!!!
        

        【讨论】:

          【解决方案9】:

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

          在我从 Apple 收到关于它的错误报告并建议我通过 nil 而不是 self 之后,我尝试了这个。

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

          【讨论】:

          • 我一直试图弄清楚如何在不显示菜单的情况下选择文本。感谢添加这个花絮。
          • 似乎不适用于警报控制器的文本字段。
          • 算了,对于警报控制器,这个答案有效:stackoverflow.com/a/35992115/433373
          • +1 以获得正确答案。另一个 +1 用于提及发送者和菜单。另一个+1用于提及信息来源。可悲的是,我只有一票...
          【解决方案10】:
          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】:

            很遗憾,我认为你做不到。

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

            【讨论】:

              【解决方案12】:

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

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

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

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

              【讨论】:

              • 我想在用户点击 UITextField 时选择所有文本,这样一旦他们开始输入,原始文本就会被删除。我应该调用哪个 Outlet 操作来实现这一目标?我尝试将里面的 touch up 链接到一个 IBAction,它调用你上面的代码但没有工作。
              • 好的,我知道了,不用担心。谢谢。
              • 只是想让你知道它对我不起作用:(当我们调用 [UIMenuController sharedMenuController].menuVisible = NO; 时菜单仍然不可见,因此该行不会有任何效果。
              • 实际上要选择所有文本以使菜单不出现,您必须改用setSelectedRange:
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-06-07
              • 2012-11-09
              相关资源
              最近更新 更多