如何禁用UITextField编辑,但仍然接受触摸?
我正在UITextField
有一个UIPickerView
作为inputView
。 它的一切都很好,除了我可以通过复制,粘贴,剪切和select文本进行编辑,而我不想要它。 只有选取器应该修改文本字段。
我知道我可以通过设置setEnabled
或setUserInteractionEnabled: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];
以上的答案是过分复杂的情况。