如何禁用UITextField编辑但仍接受触摸?

Lui*_*Prá 104 uipickerview uitextfield ios

我正在做一个UITextFieldUIPickerViewas的inputView.它很好,除了我可以通过复制,粘贴,剪切和选择文本进行编辑,我不想要它.只有Picker才能修改文本字段.

我明白了,我可以通过设置禁止编辑setEnabledsetUserInteractionEnabledNO.好的,但TextField停止响应触摸和选择器不显示.

我能做些什么来实现它?

Nic*_*ood 126

使用textfield委托,有一个方法

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Run Code Online (Sandbox Code Playgroud)

从此返回NO,用户编辑文本的任何尝试都将被拒绝.

这样您就可以启用该字段,但仍然可以阻止人们将文本粘贴到其中.

  • 如果您仍想回复触摸,请回复"触地"而不是"内部触摸".否则你的事件永远不会被调用. (4认同)
  • 更准确地说,如果需要,我们可以使用"textFieldShouldBeginEditing" (4认同)

lee*_*lee 20

尼克的答案翻译成迅捷:

P/S:返回false =>文本字段无法输入,键盘编辑.它只能通过code.EX:textField.text ="My String Here"来设置文本.

override func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return false
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用.只需长按文本字段,直到出现缩放并显示iOS剪切/复制/粘贴菜单,我可以使用它来更改文本. (2认同)
  • 迅捷4:`func textField(_ textField:UITextField,shouldChangeCharactersIn范围:NSRange,replaceString string:String)-> Bool {return false}` (2认同)

Ank*_*ain 16

这将是最简单的:

在viewDidLoad中:(仅为不应编辑的文本字段设置委托.

self.textfield.delegate=self;
Run Code Online (Sandbox Code Playgroud)

并插入此委托函数:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return NO;
}
Run Code Online (Sandbox Code Playgroud)

而已!

  • 这样可以防止拾取器出现,因此无法解决所述问题 (26认同)
  • @MartinLockett如果从该委托方法触发`UIPickerView`行为,它运行良好. (6认同)

Nad*_*mal 9

在swift 3+中:

class MyViewController: UIViewController, UITextFieldDelegate {

   override func viewDidLoad() {
      self.myTextField.delegate     = self
   }

   func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
      if textField == myTextField {
         // code which you want to execute when the user touch myTextField
      }
      return false
   }
}
Run Code Online (Sandbox Code Playgroud)


MrM*_*age 7

这将是更优雅创建一个自定义子类UITextField返回NO的所有呼叫canPerformAction:withSender:(或至少是action@selector(cut)@selector(paste)),如所描述这里.

另外,我还实现了 - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string,根据Nick的建议,以禁用从蓝牙键盘输入文本.


Tim*_*ent 7

只需将UIButton准确地放在整个UITextField上,没有Label-text,这使得它"不可见".此按钮可以接收和委托触摸而不是Textfield,并且TextField的内容仍然可见.


Sar*_*nya 7

在Swift中:

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    questionField.resignFirstResponder();
    // Additional code here
    return false
}
Run Code Online (Sandbox Code Playgroud)