textFieldShouldBeginEditing не вызывается

#iphone #objective-c #ios #mobile

#iPhone #objective-c #iOS #Мобильный

Вопрос:

Я пытаюсь использовать textFieldShouldBeginEditing , чтобы отключить отображение клавиатуры для пользовательского UITextField интерфейса. Я реализую все UITextFieldDelegate методы. Однако по какой-то причине textFieldShouldBeginEditing на самом деле никогда не вызывается.

Всегда вызываются следующие методы делегирования:

 – textFieldDidBeginEditing:
– textFieldShouldEndEditing:
– textFieldDidEndEditing:
  

Представление структурировано следующим образом:

UIViewController который содержит вид прокрутки. В зависимости от состояния представления, этот вид прокрутки будет содержать UIView список пользовательских UITextFields .

Я использую iOS 4.3.5 (8L1) на этом устройстве.

Есть идеи?

Редактировать; добавлены некоторые фрагменты кода:

UIViewController имеет следующий интерфейс

 @interface AViewController: UIViewController<UITextFieldDelegate>
  

После загрузки UIViewController я подключаю все UITextFields к представлению с помощью

 aSubView.aTextField.delegate = self;
  

(Упрощенные) реализации делегирования, расположенные в AViewController

 - (void)textFieldDidBeginEditing:(UITextField *)textField
{
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
}

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

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    return YES;
}
  

Пользовательский UITextField код

Файл упрощенной реализации —

 #import "PVEntryTextField.h"
#import "EntryViewController.h"

@implementation PVEntryTextField
@synthesize isPasswordField, state, singleTap;

- (id)initWithCoder:(NSCoder *)inCoder
{
    if (self = [super initWithCoder:inCoder])
    {
         self.font = [UIFont fontWithName:@"Helvetica-Bold" size:19];
         self.textColor = [UIColor colorWithRed:51.0/255.0 
                                         green:51.0/255.0 
                                          blue:51.0/255.0 
                                         alpha:1.0];
         self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
    }

    return self;
}

- (CGRect)textRectForBounds:(CGRect)bounds
{
    return CGRectMake(bounds.origin.x   16, bounds.origin.y,
                      bounds.size.width - 16*2 - 10, bounds.size.height);
}

- (CGRect) editingRectForBounds:(CGRect)bounds
{
    return [self textRectForBounds:bounds];
}

- (BOOL) canBecomeFirstResponder
{
    return YES;
}

- (void) updateState:(int) newState
{
     state = newState;
 }

- (void)dealloc
{
    [super dealloc];
}

 @end
  

Комментарии:

1. Если ваши другие методы делегирования вызываются для того же текстового поля, а ваши текстовые поля не являются подклассами или чем-то еще, это может быть только из-за опечатки в имени вашего метода.

2. Я выделил подкласс UITextField, чтобы внести некоторые изменения в внешний вид текстового поля. Однако на самом деле я не касался ничего, связанного с делегатами.

3. Я не уверен в этом, но возможно ли, что «textFieldShouldBeginEditing» вызывается реализацией метода по умолчанию «canBecomeFirstResponder»? Попробуйте реализовать метод с помощью [super canBecomeFirstResponder] или просто удалить его.

4. Вы были правы. Теперь это работает! Спасибо! Напишите это как ответ, и я приму его. 🙂

Ответ №1:

Возможно ли, что textFieldShouldBeginEditing это вызывается реализацией метода по умолчанию canBecomeFirstResponder ?

Попробуйте реализовать метод с помощью [super canBecomeFirstResponder] или просто удалить его.

Комментарии:

1. Спасибо! У меня был UITextField подкласс, который переопределяется canBecomeFirstResponder из-за некоторого эмпирического тестирования. Полностью пропущено.

2. Iluismontero абсолютно корректен! Похоже, что подклассы, реализующие метод ‘canBecomeFirstResponder’, должны вызывать super в какой-то момент логики. Я столкнулся с точно такой же проблемой с подклассом UITextField и, добавив [super canBecomeFirstResponder] в свой код, исправил проблему.

Ответ №2:

Установили ли вы для делегата UITextField значение «self»?

Комментарии:

1. Для делегата UITextField установлено значение self. Однако это вызывается из основного UIViewController. Реализация методов делегирования также находится в основном UIViewController.

2. Вы должны установить делегат UITextView для класса, который реализует методы UITextViewDelegate

Ответ №3:

Для всех, кто приходит сюда и не нашел решения. Моя проблема заключалась в том, что я создал текстовое поле в IB, а затем выделил его в своем viewDidLoad. Когда я удалил создание экземпляра, делегат работал правильно, поскольку он был привязан к правильному TF.

 //I REMOVED these two lines because I created the textfield in IB
_nameTextField = [[UITextField alloc] init];
_priceTextField = [[UITextField alloc] init];


[_nameTextField setDelegate:self];
[_priceTextField setDelegate:self];
  

Ответ №4:

Я также столкнулся с проблемой отсутствия вызова textFieldShouldEndEditing или textFieldShouldReturn . Это произошло после обновления раскадровки моего приложения.

Методы делегирования вызывались, когда UITextFields были частью подкласса ViewController.

Но, когда они были перемещены в вид прокрутки в ViewController, методы больше не вызывались.

Установка для их делегатов приложений значения self в viewDidLoad устранила эту проблему.

 self.emailField.delegate = self;
self.passwordField.delegate = self;
  

Комментарии:

1. Удивительные. В моей ситуации у меня есть представление, представленное в контроллере навигации, и ничего не работало правильно … события касания, текстовые поля и т. Д. Я назначил делегатов, как вы предложили, и это сработало… полное дерьмо.

Ответ №5:

В Swift-3 следующий метод требует «_» перед текстовым полем, чтобы вызвать этот метод делегирования. В моем случае это помогает мне.

 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
}
  

Ответ №6:

Не знаю, является ли ошибка опечатки при копировании кода здесь, но имя метода неверно:

ПРАВИЛЬНО — textFieldShouldBeginEditing

ВАШ — textFieldShoulBeginEditing (отсутствует буква «d»)