如何在Objective-C中设置文本字段的委托?

时间:2012-08-06 23:06:24

标签: objective-c ios delegates uitextfield

我想通过将其限制为四个字符来自定义UITextField。我正在尝试了解代理如何在Objective-C中工作,并且已经完成了以下步骤来实现此功能,但仍然无法获得可行的解决方案。

1)创建了一个LimitedLengthTextField objective-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”的委托,如下所示(我的app接受用户SSN的最后4位数字)。

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

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

4 个答案:

答案 0 :(得分:20)

你不应该有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;
}

答案 1 :(得分:2)

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

_ssn.delegate = self;

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您正在将委托设置为本地对象,我假设该对象在当前作用域的末尾被取消分配。您有责任确保代表的生命至少与其相应的对象一样长。更好的方法是在视图控制器中实现委托方法,并将自定义字段的委托设置为该方法。它只会影响那个,而不会影响其他人。另一种方法是在内部使用私有类实现委托。然后你只需要设置类并完成。