连接表单文本字段的下一个字段链

时间:2015-02-20 22:26:37

标签: ios objective-c interface-builder

我尝试以注册形式连接文本字段,以便在完成每个文本字段后,表单中的下一个字段自动变为活动状态。为此,我在注册视图的视图控制器中扩展了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.'

有点失去了如何解决这个问题,任何帮助将不胜感激!提前谢谢。

2 个答案:

答案 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