Как отключить редактирование UITextField, но все же принять прикосновение?



Я UITextField что есть UIPickerView как inputView. Его все хорошо, за исключением того, что я могу редактировать путем копирования, вставки, вырезания и выделения текста, и я не хочу этого. Только средство выбора должно изменить текстовое поле.



я узнал, что могу отключить редактирование, установив setEnabled или setUserInteractionEnabled до NO. Хорошо, но текстовое поле перестает отвечать на прикосновение, и сборщик не появляется.



что я могу сделать, чтобы достичь этого?

1941   14  

14 ответов:

используя делегат textfield, есть метод

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

Return 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 представлен скрытым текстовым полем,которое также изменяет текст представленного и отключенного.

Я :

[self.textField setEnabled:NO];

и его работать нормально

это сработало для меня [textview setEditable:NO]; Приведенные выше ответы чрезмерно усложняют ситуацию.

Comments

    Ничего не найдено.