禁用UITextField键盘?

62
我在我的应用程序中添加了数字键盘以将数字输入到文本视图中,但是为了输入数字,我必须点击文本视图。一旦我这样做了,常规键盘就会出现,而我不想要它。
如何完全禁用键盘?非常感谢您的帮助。
10个回答

107

UITextField的inputView属性默认为nil,这意味着会显示标准键盘。

如果您将其分配为自定义输入视图或仅为虚拟视图,则键盘将不会出现,但是闪烁光标仍将出现:

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

如果您想隐藏键盘和闪烁的光标,则可以使用以下方法:

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    return NO;  // Hide both keyboard and blinking cursor.
}

Caleb在下面已经解释了这个问题,但我想补充一点,任何UIView都可以设置为inputView。这将导致该视图以与标准键盘相同的方式进行动画化进入和退出。 - BreadicalMD
在开发自定义键盘应用扩展时,这非常有用。如果您在自定义键盘中包含UISearchBar或UITextField,则它将尝试显示键盘(尽管它已经在键盘中),这意味着它将根据其视图/控制器层次结构杀死当前的键盘,然后重新创建它。我通过这个老派的技巧解决了这个问题。谢谢! - CSolanaM
最终我采用了更为简洁的方法,使用外观代理,并依赖于相同的概念:[[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setInputView:[UIView new]]; - CSolanaM
这个方案可以工作,但如果你使用Mac键盘在UITextfield中输入,应用程序会崩溃。这不是一个好的解决方案。 - Norolim

74

适用于 Swift 2.x、3.x、4.x、5.x

textField.inputView = UIView()

有效果


4
马丁和萨蒂什又做到了。 - Pavlos
你可以使用 textField.inputAccessoryView = UIView() 隐藏 accessoryView,同时也可以使用 textField.tintColor = .white 隐藏光标(Swift 5.x)。 - Brian L
1
对我来说非常出色的工作...... - M Hamayun zeb

5
如果是UITextField,您可以将其enabled属性设置为NO。
如果是UITextView,您可以在其委托中实现-textViewShouldBeginEditing:来返回NO,这样它就永远不会开始编辑。或者您可以子类化它并覆盖-canBecomeFirstResponder以返回NO。或者您可以利用它的编辑行为,将数字按钮放入一个视图中,然后将该视图用作文本视图的inputView。这应该会导致在编辑文本视图时显示按钮。这可能是您想要的,也可能不是。

这是我将按钮写入特定文本字段、设置标志并调用的方式,如果(current.tag == 10) { textfieldflag = 1; [loanAmount setUserInteractionEnabled:NO]; [period setUserInteractionEnabled:YES]; [interest setUserInteractionEnabled:YES]; //[deposit setUserInteractionEnabled:YES]; loanAmount.editable = NO; } - michael
喔好,终于搞定了。谢谢你,这个问题如此简单,可是 Google 没有答案。 - michael

4

根据您现有的按钮工作方式,这可能会破坏它们,但您可以通过将textView的editable属性设置为NO来防止键盘弹出。

myTextView.editable = NO

2
他要求的是UITextField,而不是UITextView。 - Sebyddd

2

当我在同一个视图上有2个文本字段时,我遇到了相同的问题。我的目的是为一个文本字段显示默认键盘,而对于第二个文本字段则隐藏默认键盘,并显示下拉列表。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 

这个方法对于两个文本框并没有像我预期的那样起作用,唯一的解决办法是

    UIView* dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];    
    myTextField.inputView = dummyView; 
    myTextField.inputAccessoryView = dummyView; 
    myTextField.tintColor =  myTextField.backgroundColor; //to hide a blinking cursor

这将完全隐藏目标文本框(在我的情况下是DropDownList),并在用户切换到第二个文本框(我的截图上的账号)时显示默认键盘。

enter image description here


你的回答真的很棒!因为它提供了将inputAccessoryView设置为dummyView的解决方案。我一直在苦苦挣扎-如何将其从屏幕底部隐藏。 - Vitya Shurapov

1

在这里输入图像描述有一个简单的技巧。在键盘上方放置一个空按钮(无文本),并将动作事件分配给它。这样可以阻止键盘弹出,并且您可以执行任何想要的操作,以处理按钮单击事件。


0

禁用UITextField键盘:

  1. 进入Main.Storyboard
  2. 单击UITextField以选择它
  3. 显示属性检查器
  4. 取消选中用户交互启用

禁用UITextView键盘:

  1. 进入Main.Storyboard
  2. 单击UITextView进行选择
  3. 显示属性检查器
  4. 取消选中可编辑行为

2
如果你这样做,文本框将无法触摸。因此,您无法单击并编写任何内容。 - Yucel Bayram

0

我使用了 keyboardWillShow NotificationtextField.endEditing(true)

lazy var myTextField: UITextField = {
    let textField = UITextField()
    // ....
    return textField
}()

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
}

@objc func keyboardWillShow(_ notification: Notification) {
        
    myTextField.endEditing(true)

    // if using a textView >>> myTextView.endEditing(true) <<<
}

-2
private void TxtExpiry_EditingDidBegin(object sender, EventArgs e)
    {
        ((UITextField)sender).ResignFirstResponder();
    }

在C#中,这对我起作用了,我不使用故事板。

-3
在Xcode 8.2中,您可以通过取消“启用”选项状态轻松完成此操作。
  1. 单击要设置为不可编辑的textField
  2. 转到右侧的属性检查器
  3. 取消“状态”下的“启用”复选框

enter image description here

或者如果你想通过代码实现,你可以简单地创建一个这个文本框的 @IBOutlet,给它一个名称,然后在 viewDidLoad 函数中使用这个变量名(或任何自定义函数,如果你打算这样做),就像这样(在 Swift 3.0.1 中):

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    myTextField.isEditable = false
}

1
isEditable不存在。 - Andrea.Ferrando

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接