Делегат UITextField не работает

У меня есть следующий код:

@interface MyCell : UITableViewCell<UITextFieldDelegate>
{
    IBOutlet UITextField *txtFields;
}

- (IBAction)textFieldAction:(id)sender;
@property (nonatomic,retain) IBOutlet UITextField *txtFields;

@end

У меня также есть следующая функция делегата:

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

Однако я замечаю, что он НИКОГДА не вызывается. Я установил делегата из построителя интерфейса, а также из кода в соответствии с: [txtFields setDelegate:self];, но, похоже, ни один из них не работает. Есть ли что-то еще, что мне не хватает для этого?


person KVISH    schedule 12.09.2012    source источник
comment
Используете ли вы txtFields где-нибудь еще?   -  person Ravi    schedule 12.09.2012
comment
Розетка подключена?   -  person Tom    schedule 12.09.2012
comment
@ Рави, он больше нигде не используется   -  person KVISH    schedule 12.09.2012
comment
@ Том, да, розетка была подключена.   -  person KVISH    schedule 12.09.2012
comment
Что ж, это звучит странно. Проверено, случайно ли для userInteractionEnabled не установлено значение NO? Кроме того, клавиатура всплывает?   -  person Ravi    schedule 12.09.2012
comment
Я заметил, что вы используете его в пользовательской UITableViewCell, если вы создаете ячейку с помощью Interface Builder, вы уверены, что сопоставили файл XIB с вашим пользовательским классом ячейки?? это может быть причиной того, что делегат никогда не вызывается   -  person jere    schedule 12.09.2012
comment
это статическая ячейка или динамическая ячейка? Вы используете XIB или раскадровки?   -  person pdriegen    schedule 12.09.2012
comment
userInteractionEnabled не НЕТ, и клавиатура появляется. и я сопоставил xib со своим классом.... это действительно странно. Я уверен, что это глупая ошибка, но ее трудно найти.   -  person KVISH    schedule 12.09.2012
comment
Где вы устанавливаете делегата? Вы устанавливаете делегата для каждой отдельной ячейки, когда используете метод cellForRowAtIndexPath? Потому что у вас есть много экземпляров этой ячейки. Не могли бы вы показать часть, где вы программно устанавливаете делегата?   -  person hol    schedule 13.09.2012
comment
Вы смотрели это? то есть вы реализуете canBecomeFirstResponder в MyCell?   -  person ilmiacs    schedule 13.09.2012
comment
Связан ли ваш textFieldAction: с мероприятием по внутренней отделке или каким-либо другим мероприятием? Потенциально может привести к конфликтному/переопределяющему поведению.   -  person ilmiacs    schedule 13.09.2012
comment
Вы действительно установили делегата UITextField для этого класса?   -  person RileyE    schedule 13.09.2012


Ответы (2)


Вы, очевидно, используете это в сочетании с UITableView. Во-первых, если вы хотите поддерживать взаимодействие с пользователем, txtFields должны быть подпредставлением ячейки contentView, а не backgroundView.

Предполагая, что объект txtFields является подвидом contentView, давайте посмотрим на соединения.

У tableView есть метод cellForRowAtIndexPath:, в котором вы либо возвращаете новую ячейку, либо переработанную ячейку. В самом низу этой ячейки добавьте:

NSLog(@"textFields=%@ delegate=%@", cell.txtFields, cell.txtFields.delegate);
assert(cell.txtFields.delegate == cell); // lets make sure this is proper

Если на самом деле присутствуют оба аргумента, теперь вы знаете, что объект txtFields находится в правильном контейнере (contentView), что свойство работает и что делегат установлен в ячейку.

Если с этим все в порядке и у вас не появляется клавиатура при нажатии, то, скорее всего, что-то еще накладывает txtFields - какой-то другой прозрачный вид и он ест касания.

В этом случае вы должны создать небольшое демонстрационное приложение, используя класс MyCell, даже с одной жестко закодированной ячейкой, которая демонстрирует проблему, а затем загрузить это (заархивированное) в свою учетную запись DropBox, где другие, такие как я, могут взглянуть на него и найти проблема.

person David H    schedule 12.09.2012

Попробуйте удалить:

{ IBOutlet UITextField *txtFields; }

так как у вас уже есть @property.

Кроме того, вы @synthesize txtFields;?

person Aaron Brager    schedule 13.09.2012