11

我想UITextField通过将 a 限制为四个字符来自定义它。我试图了解代表是如何工作的,Objective-C并已通过以下步骤来实现此功能,但仍然没有获得有效的解决方案。

1) 创建了一个 LimitedLengthTextField 目标 c 类。制作类型的类UITextField并接受 < UITextFieldDelegate > 类型的对象。

LimitedLengthTextField.h:

@interface LimitedLengthTextField : UITextField <UITextFieldDelegate>
@end

2)在LimitedLengthTextField.m中实现如下方法:

@implementation LimitedLengthTextField

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 4) ? NO : YES;
}

@end

3) 在我的 CreateAccount 类中导入“LimitedLengthTextField.h”,并尝试viewDidLoad如下设置 UITextField“ssnTextField”的委托(我的应用程序接受用户 SSN 的最后 4 位数字)。

// Set the custom SSN textfield delegate
LimitedLengthTextField *custTextField = [[LimitedLengthTextField alloc] init];
[self.ssnTextField setDelegate:custTextField];

基于我对Objective-C委托的有限理解,我现在创建了一个类,实现了我想要的委托方法,然后创建了该类的一个实例并将其分配给我的 UITextView 对象。我错过了什么?

4

4 回答 4

21

您不应该将 UITextField 子类化。相反,您在 CreateAccount 类中实现回调。所以你应该有这样的东西:

@interface CreateAccount :UIViewController <UITextFieldDelegate>
// I use UIViewController but whatever your CreateAccount from.

并在您的 CreateAccount.m 文件中实现它:

这可能在您的 viewDidLoad 方法中:

Self.cusTextField.delegate = self;

还有这个

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 4) ? NO : YES;
}
于 2012-08-07T02:59:43.220 回答
2

也许您应该使 CreateAccount(我假设它是一个包含文本字段的视图控制器?)符合UITextFieldDelegate而不是自定义文本字段,并shouldChangeCharactersInRange在 CreateAccount 类中实现方法。此外,将代表更改为

_ssn.delegate = self;

在这种情况下,也许您根本不需要自定义文本字段。

于 2012-08-06T23:13:21.203 回答
0

应该实现该方法的文本字段应该是 LimitedLengthTextField 类型。让其他的类型为 UITextField

于 2012-08-06T23:20:18.613 回答
0

您正在将您的委托设置为一个本地对象,我假设该对象在当前范围结束时被释放。您有责任确保委托至少与其对应的对象一样长。更好的方法是在您的视图控制器中实现委托方法并将您的自定义字段的委托设置为该方法。它只会影响那个,不会影响其他。另一种方法是使用私有类在内部实现委托。然后你只需要设置类并完成。

于 2012-08-07T00:41:35.033 回答