Как отключить редактирование UITextField, но все же принять прикосновение?
Я UITextField что есть UIPickerView как inputView. Его все хорошо, за исключением того, что я могу редактировать путем копирования, вставки, вырезания и выделения текста, и я не хочу этого. Только средство выбора должно изменить текстовое поле.
я узнал, что могу отключить редактирование, установив setEnabled или setUserInteractionEnabled до NO. Хорошо, но текстовое поле перестает отвечать на прикосновение, и сборщик не появляется.
что я могу сделать, чтобы достичь этого?
14 ответов:
используя делегат textfield, есть метод
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)stringReturn NO from this, и любая попытка пользователя отредактировать текст будет отклонена.
таким образом, вы можете оставить поле включенным, но все же запретить людям вставлять в него текст.
Это было бы проще всего:
in viewDidLoad: (установите делегат только для текстовых полей, которые не должны быть редактируемыми.
self.textfield.delegate=self;и вставьте эту функцию делегата:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ return NO; }вот оно!
перевести ответ Ник в Swift:
P / S: Return false => текстовые поля не могут вводить, редактировать с помощью клавиатуры. Он просто может установить текст по коду.Пример: текстовое поле.текст = "моя строка"
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 }
было бы более элегантно создать пользовательский подкласс
UITextFieldвозвращаетNOдля всех вызововcanPerformAction:withSender:(или хотя бы гдеaction- это@selector(cut)или@selector(paste)), как описано здесь.кроме того, я бы также реализовать - (БООЛ)класса textfield:(поле UITextField *)textfield в shouldChangeCharactersInRange:(NSRange)replacementString ряд:(NSString *)строки согласно предложению Ника, чтобы отключить ввод текста с клавиатур Bluetooth.
в 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 } }
просто поместите UIButton точно по всему UITextField без текста метки, что делает его"невидимым". Эта кнопка может получать и делегировать прикосновения вместо текстового поля, и содержимое текстового поля по-прежнему отображается.
для альтернативы, которая обрабатывает листы UIPickerView и Action, checkout ActionSheetPicker
https://github.com/TimCinel/ActionSheetPicker
это cocoapods включен. Он обрабатывает все кнопки Отмена и готово на листе действий. Примеры в рамках примера проекта велики. Я выбираю ActionSheetStringPicker, который легко обрабатывает только строковые параметры, но API может обрабатывать почти все, что я могу думать из.
Я изначально начал решение, похожее на отмеченный ответ, но наткнулся на этот проект и взял меня примерно за 20 минут, чтобы интегрировать вещи в мое приложение для использования, включая использование cocopods: ActionSheetPicker (~>0.0)
надеюсь, что это помогает.
загрузите проект git и посмотрите на следующее классы:
- ActionSheetPickerViewController.м
- ActionSheetPickerCustomPickerDelegate.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. Единственное, что я бы добавил, Вы должны отказаться от 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 } }
чтобы предотвратить редактирование UITextField при использовании UIPickerView для выбора значений (в Swift):
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 }
этот метод работает. Поместите прозрачный 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 представлен скрытым текстовым полем,которое также изменяет текст представленного и отключенного.
это сработало для меня
[textview setEditable:NO];Приведенные выше ответы чрезмерно усложняют ситуацию.
Comments