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