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

我正在UITextField有一个UIPickerView作为inputView 。 它的一切都很好,除了我可以通过复制,粘贴,剪切和select文本进行编辑,而我不想要它。 只有选取器应该修改文本字段。

我知道我可以通过设置setEnabledsetUserInteractionEnabled:NO来禁用编辑。 好的,但TextField停止响应触摸和选取器不显示。

我能做些什么来实现它?

使用文本字段委托,有一个方法

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

返回NO,任何用户尝试编辑文本将被拒绝。

这样,您可以离开该字段,但仍然阻止人们粘贴文本。

这将是最简单的:

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

 self.textfield.delegate=self; 

并插入这个委托函数:

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ return NO; } 

而已!

如下所述,创buildUITextField的自定义子类将会更加优雅,该子类canPerformAction:withSender:所有对canPerformAction:withSender:调用返回NO canPerformAction:withSender:至less在@selector(cut)@selector(paste) )。

另外,我还会实现 – (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)范围replacementString:(NSString *)string按照尼克的build议,以禁止从蓝牙键盘input文本。

Nick的答案翻译成swift:

P / S:返回false =>文本框不能input,用键盘编辑。 它可以通过code.EX设置文本:textField.text =“我的string在这里”

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

在Swift中:

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

只需将一个UIButton放在整个UITextField上,而不需要使其“不可见”的标签文本。 此button可以接收和委托触摸而不是文本字段,并且TextField的内容仍然可见。

对于处理UIPickerView和Action Sheets的替代方法,请检出ActionSheetPicker

https://github.com/TimCinel/ActionSheetPicker

这是cocoapods启用。 它处理操作表上的所有取消和完成button。 示例项目中的示例非常棒。 我select了ActionSheetStringPicker,它很容易处理基于String的选项,但是API可以处理大部分我能想到的事情。

我最初开始一个解决scheme,就像复选标记的答案,但偶然发现了这个项目,并花了我大约20分钟,把事情集成到我的应用程序的使用,包括使用cocopods:ActionSheetPicker(〜> 0.0)

希望这可以帮助。

下载git项目,看看下面的类:

  • ActionSheetPickerViewController.m
  • ActionSheetPickerCustomPickerDelegate.h

这里是我添加的大部分代码,加上* .h导入。

 - (IBAction)gymTouched:(id)sender { NSLog(@"gym touched"); [ActionSheetStringPicker showPickerWithTitle:@"Select a Gym" rows:self.locations initialSelection:self.selectedIndex target:self successAction:@selector(gymWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender]; } - (void)actionPickerCancelled:(id)sender { NSLog(@"Delegate has been informed that ActionSheetPicker was cancelled"); } - (void)gymWasSelected:(NSNumber *)selectedIndex element:(id)element { self.selectedIndex = [selectedIndex intValue]; //may have originated from textField or barButtonItem, use an IBOutlet instead of element self.txtGym.text = [self.locations objectAtIndex:self.selectedIndex]; } -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField { return NO; // Hide both keyboard and blinking cursor. } 

我使用了MrMage提供的解决scheme。 我唯一要补充的是你应该把UITextView作为第一响应者,否则你会被选中的文本卡住。

这是我的swift代码:

 class TouchableTextView : UITextView { override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { self.resignFirstResponder() return false } override func shouldChangeTextInRange(range: UITextRange, replacementText text: String) -> Bool { self.resignFirstResponder() return false } } 

此解决方法工作。 在文本字段上方放置一个透明的UIView,并实现以下代码:

 - (void)viewDidLoad { [super viewDidLoad]; UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)]; [transparentView addGestureRecognizer:press]; [press release]; press = nil; } -(void)longPress { txtField.userInteractionEnabled = NO; } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { txtField.userInteractionEnabled = YES; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [txtField becomeFirstResponder]; } 

使您的inputView由一个隐藏的文本字段,也改变了呈现和禁用的文字。

要防止在使用UIPickerViewselect值(在Swift中)时编辑UITextField:

 self.txtTransDate = self.makeTextField(self.transDate, placeHolder: "Specify Date") self.txtTransDate?.addTarget(self, action: "txtTransDateEditing:", forControlEvents: UIControlEvents.EditingDidBegin) func makeTextField(text: String?, placeHolder: String) -> UITextField { var textField = UITextField(frame: CGRect(x: 140, y: 0, width: 220.00, height: 40.00)); textField.placeholder = placeHolder textField.text = text textField.borderStyle = UITextBorderStyle.Line textField.secureTextEntry = false; textField.delegate = self return textField } func txtTransDateEditing(sender: UITextField) { var datePickerView:UIDatePicker = UIDatePicker() datePickerView.datePickerMode = UIDatePickerMode.Date sender.inputView = datePickerView datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged) } func datePickerValueChanged(sender: UIDatePicker) { var dateformatter = NSDateFormatter() dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle self.txtTransDate!.text = dateformatter.stringFromDate(sender.date) } func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { self.resignFirstResponder() return false } 

在快速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 } } 

我用了 :

 [self.textField setEnabled:NO]; 

它的工作很好

这对我[textview setEditable:NO]; 以上的答案是过分复杂的情况。