【问题标题】:UITextField functionality with no keyboard没有键盘的 UITextField 功能
【发布时间】:2012-02-05 15:33:14
【问题描述】:

我正在构建一个具有用于输入文本的自定义界面的应用程序,并且正在使用 UILabel 进行显示。然后,用户必须能够复制和粘贴文本,所以我使用了 UITextField。

我的问题是我不知道如何让 UITextField 允许选择、复制、粘贴等,但是在选择字段时没有显示键盘。

我已经阅读了许多与此类似的帖子,但没有人提出完全相同的问题,也没有任何解决方案适合我。我尝试使该字段不可编辑,这确实会阻止键盘出现,但也不允许复制和粘贴。我也读过建议子类化 UITextField 的 cmets,但我读过的都没有给出具体的例子。

我想做的事情可以简单地完成,还是我需要为键盘或其他选项创建自定义视图?

谢谢, 安德鲁

解决方案:

最后,我在 stackoverflow 上发现了另一个类似(但不准确)的问题,其中一个答案为我的问题提供了解决方案。解决方法是让应用程序显示一个虚拟视图作为键盘,其他一切都按照它应该的方式工作。

UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];    
VIN.inputView = dummyView; // Hide keyboard, but show blinking cursor

它适用于 UITextField 和 UITextView,需要将它们设置为可编辑。

【问题讨论】:

    标签: uitextfield


    【解决方案1】:

    使其成为 UITextView,并使 UITextView 不可编辑。这仍然允许复制。

    编辑:是的,我的糟糕我忘记了那部分......基本上你所做的是制作一个可滚动的标签。

    如果您想要在没有键盘的情况下使用所有功能,则需要使其可编辑,并将 UITextFieldDelegate 的 -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField 编辑为 return NO。这将阻止键盘出现。

    【讨论】:

    • 谢谢。那成功了。经过大量搜索后非常感谢,我找不到任何表明 UITextView 会更好的东西。
    • 第一次实现这个的时候,我觉得还可以。然而,现在,当我再看时,我只能复制。不允许粘贴,可能是因为它是编辑。还有其他想法吗?
    • 我仍然无法完成这项工作。我尝试使用 UITextViewDelegate 的 textViewShouldBeginEditing 将其设为 UITextView,并使用 UITextFieldDelegate 的 textFieldShouldBeginEditing 将其设为 UITextField。在这两种情况下,当使用 return NO 时,它不仅会阻塞键盘,还会阻塞所有的编辑功能。
    • 好的,而不是返回 no,您需要编辑键盘方法来隐藏它。在我的脑海中,您可以制作一个向上滚动的滚动视图,将键盘隐藏在下面。通过使滚动视图不允许用户交互,它将隐藏键盘。如果您能想到更好的方法,请改为这样做。
    • Devin,感谢您抽出宝贵时间提供帮助。我做了一堆环顾和测试,我的最终解决方案被添加到我最初的问题中。感谢您的帮助。
    【解决方案2】:

    作者代码...

    UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];    
    VIN.inputView = dummyView; // Hide keyboard, but show blinking cursor
    

    (其中 'VIN' 是 UITextField 变量,这段代码放在 viewDidLoad 之类的地方)

    ...确实可以防止显示 iPhone/iPad 弹出式键盘。

    不过,这只是键盘界面的“显示”部分。如果您连接了外部键盘,例如插入 30 针的 Apple 物理 iPhone/iPad 键盘或无数蓝牙键盘之一(甚至使用带模拟器的 Mac 键盘),用户仍然可以在没有显示键盘弹出显示。

    此外,即使没有显示键盘弹出窗口,用户仍然可以通过双击该字段并选择“粘贴”从粘贴板粘贴到该字段中。

    以下附加代码可防止使用这些键盘并防止粘贴:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        NSLog(@"myXViewController shouldChangeCharactersInRange");
        return FALSE;
    }
    

    ...仍然允许选择,但不允许编辑字段中的文本。

    【讨论】:

    • 关于外接键盘的优点——在某些情况下肯定是一个考虑因素。至于粘贴功能,这就是问题的重点——隐藏键盘并仍然允许复制/粘贴功能。
    • 感谢,'VIN' 是 UITextField 变量,这段代码放在 viewDidLoad 之类的地方!!
    【解决方案3】:

    解决方案:

    最后,我在 stackoverflow 上发现了另一个类似(但不准确)的问题,其中一个答案为我的问题提供了解决方案。解决方法是让应用程序显示一个虚拟视图作为键盘,其他一切都按照它应该的方式工作。

    UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];    
    VIN.inputView = dummyView; // Hide keyboard, but show blinking cursor
    

    它适用于UITextFieldUITextView,需要将它们设置为可编辑。

    【讨论】:

    • 如果你在 iOS 7 中这样做,你会得到一条白线作为这个问题stackoverflow.com/questions/20946524/…。你知道它的解决方案吗?
    • 看起来有人回答了这个问题,暗示 1 像素矩形是问题所在,这可能会解决它:CGRectMake(0, 0, 0, 0)。
    • U 可以使用 [UIView new] 创建零帧视图。
    【解决方案4】:

    我在委托方法中使用[textfield resignFirstResponder] -(void)textFieldDidBeginEditing:(UITextField *)textField,如下所示:

    -(void)textFieldDidBeginEditing:(UITextField *)textField
    {
        if (textField == yourTextField){
          [yourTextfield resignFirstResponder];
        }
    }
    

    所以键盘根本来不及出现

    【讨论】:

      【解决方案5】:

      在 Swift 4 中:

      let dummyView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
      textInputLabel.inputView = dummyView
      textInputLabel.becomeFirstResponder()
      

      【讨论】:

      • 或者更简洁:textInputLabel.inputView = UIView(frame: CGRect.zero)
      【解决方案6】:

      这是对我有用的方法:

      func textFieldDidBeginEditing(_ textField: UITextField) {
          if someCondition {
              textField.resignFirstResponder()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-21
        • 2012-01-13
        • 2015-05-16
        • 1970-01-01
        相关资源
        最近更新 更多