我认为你不需要子类UITextField
来实现你的目标。无论如何,您尝试实施的解决方案存在哲学缺陷,因为它破坏了封装。
怎么解决?您的文本字段几乎肯定归视图控制器子类所有。只要该对象符合UITextFieldDelegate
协议并且每个文本字段都将控制器对象作为其委托,那么您应该很好。剩下的唯一任务就是将文本字段映射到控制器或其他对象上的属性。
让我们假设您的控制器拥有某个数据对象的实例,您正在尝试使用控制器的 UI 设置其属性。我们称之为MyDataObject
:
@interface MyDataObject : NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@end
@implementation MyDataObject
@end
要将文本字段映射到此对象的属性,您可以执行以下操作:
- (NSString *)propertyNameForTextField:(UITextField *)field {
static NSDictionary *map;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
map = @{(id)self.fnField: @"firstName",
(id)self.lnField : @"lastName" };
});
return map[field];
}
然后在我们的UITextFieldDelegate
方法中,我们这样做:
- (void)textFieldDidEndEditing:(UITextField *)textField {
[_dataObject setValue:textField.text forKey:[self propertyNameForTextField:textField]];
}
请注意,我没有进行错误检查、验证等。这只是为了展示一种将 UI 元素映射到它们应该影响的属性的方法。这是在 iOS 上;Mac OS 上的绑定可用于此用例。