2015-02-20 2 views
0

Я пытаюсь подключить текстовые поля в форме регистрации, чтобы при каждом нажатии на каждое новое поле в форме автоматически активировалось. Для этого я расширил класс UITextField, как показано ниже, в контроллере представления для просмотра.Подключение следующей цепочки полей для текстовых полей формы

@interface UITextField (Extended) 
    @property (nonatomic, weak) IBOutlet UITextField* nextField; 
@end 

Я затем установить розетки nextField через интерфейс строитель для каждого поля в форме, и следующий код реализован в контроллере представления, который также выступает в качестве делегата для текстовых полей в форме ,

- (BOOL) textFieldShouldReturn:(UITextField *)textField { 
    [textField resignFirstResponder]; 
    UITextField* field = textField.nextField; 
    if (field) 
     [field becomeFirstResponder]; 
    return NO; 
} 

Однако при создании и запуске приложения, он сразу происшествиям дает следующее сообщение об ошибке:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason:'[<UITextField 0x78729580> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key nextField.' 

немного потеряли о том, как решить эту проблему, любая помощь будет оценен по достоинству! Заранее спасибо.

ответ

1

Просто удалите все розетки и заново создайте их снова. Вы просто пропустили или дублировали один из них, так как у вас есть несколько текстовых полей, очень возможно, что что-то пошло не так. И убедитесь, что каждый nextField действительно указывает на следующее поле :)

ОБНОВЛЕНИЕ: Уже поздно, поэтому я пропустил одну большую проблему. Вы не можете добавлять новые свойства через категорию в существующий класс. Причина в том, что категория не способна создавать опорную переменную за кулисами. (Существует способ с objects..but связанно это лучше не углубляться в эту черную магию.)

Вместо UItextField+extended категорий подклассаUITextfield класса.

@interface CustomTextField : UITextField 

@property (nonatomic, strong) IBOutlet UITextField *nextField; 

@end 

Затем в интерфейсе строителя, вы должны установить этот класс CustomTextfield в классе инспектора для каждого текстового поля.

+0

Я попытался удалить и повторно подключить розетки несколько раз, и проблема не устранена. Нужно ли подключать все розетки к чему-то? Возникает ли неподключенная розетка? –

+0

Проверьте обновление: в этом ответе. –

+0

Это сделало это! Позволяли им настраиваться через IB, работали как обаяние. Благодаря! :) –

0

Проблема заключается в том, что в то время как вы можете объявить свойство в категории, компилятор не будет определять сорбент свойства и сеттер для вас. Вы должны определить геттер и сеттер самостоятельно.

Вы можете использовать «связанный объект» для хранения значения свойства. См., Например, код this answer. Поскольку вы не хотите, чтобы ваше свойство nextField сохраняло следующее поле, используйте OBJC_ASSOCIATION_ASSIGN вместо OBJC_ASSOCIATION_RETAIN_NONATOMIC при настройке связанного объекта.

Смежные вопросы