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

Connecting next field chain for form text fields

我正在尝试连接注册表单中的文本字段,以便在完成每个字段的按下后,表单中的下一个字段会自动变为活动状态。为此,我在注册视图的视图控制器中扩展了 UITextField class,如下所示。

@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.'

关于如何解决这个问题有点迷茫,任何帮助将不胜感激!提前致谢。

只需移除所有插座并重新创建它们即可。您只是错过或重复了其中一个,因为您有多个文本字段,所以很可能出了问题。并确保每个 nextField 确实指向下一个字段:)

更新:现在是深夜,所以我错过了一个大问题。 您不能像那样通过类别向现有 class 添加新属性。原因是类别无法在幕后创建支持变量。 (有一种关联对象的方法..但最好不要深入研究那个黑魔法。)

而不是UItextField+extended类别,子class UITextfield class.

@interface CustomTextField : UITextField

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

@end

然后在界面生成器中,您必须在 class 检查器中为每个文本字段设置 CustomTextfield class。

问题是,虽然您可以在类别中声明 属性,但编译器不会定义 属性 getter 和 setter 给你。您必须自己定义 getter 和 setter。

您可以使用“关联对象”来存储 属性 值。有关示例代码,请参见 this answer。由于您不希望 nextField 属性 保留下一个字段,因此在设置关联对象时使用 OBJC_ASSOCIATION_ASSIGN 而不是 OBJC_ASSOCIATION_RETAIN_NONATOMIC