我尝试以注册形式连接文本字段,以便在完成每个文本字段后,表单中的下一个字段自动变为活动状态。为此,我在注册视图的视图控制器中扩展了UITextField类,如下所示。
@interface UITextField (Extended)
@property (nonatomic, weak) IBOutlet UITextField* nextField;
@end
然后我通过接口构建器为表单中的每个字段设置nextField出口,并在视图控制器中实现以下代码,该控制器也充当表单中文本字段的委托。 / p>
- (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.'
有点失去了如何解决这个问题,任何帮助将不胜感激!提前谢谢。
答案 0 :(得分:1)
只需移除所有插座并重新创建它们即可。你刚刚错过或复制其中一个,因为你有几个文本字段,很可能出现了问题。并确保每个nextField确实指向下一个字段:)
更新:已经是深夜,所以我错过了一个大问题。 您无法通过类别将新属性添加到现有类中。原因是类别无法在幕后创建支持变量。 (有一种关联对象的方法..但最好不要深入研究那种黑魔法。)
而不是UItextField+extended
类别,子类 UITextfield
类。
@interface CustomTextField : UITextField
@property (nonatomic, strong) IBOutlet UITextField *nextField;
@end
然后在界面构建器中,您必须在类检查器中为每个文本字段设置CustomTextfield类。
答案 1 :(得分:0)
问题在于,虽然您可以声明某个类别中的属性,但编译器不会为您定义属性getter和setter。你必须自己定义getter和setter。
您可以使用“关联对象”来存储属性值。有关示例代码,请参阅this answer。由于您不希望nextField
属性保留下一个字段,因此在设置关联对象时请使用OBJC_ASSOCIATION_ASSIGN
代替OBJC_ASSOCIATION_RETAIN_NONATOMIC
。