我应该在哪个方法中设置UITextField的委托?

时间:2011-08-15 07:14:15

标签: objective-c ios

在viewDidLoad或init方法中设置UITextField的委托是一种好习惯吗? 我尝试在init方法中将委托设置为self,但它没有调用相应的委托方法,当我将代码移动到viewDidLoad时,它注册为设置self作为委托? 似乎我应该能够在任何一种方法中设置它,如果有人可以帮我清除它,我将非常感激。

-(id) init {
    self = [super init];
    if (self) 
        textField.delegate = self;     //this text field is an IBOutlet
        //some other code here as well
    return self;
}

OR

-(void)viewDidLoad {
    [super viewDidLoad];
    textField.delegate = self;
}

2 个答案:

答案 0 :(得分:3)

如果您的文字字段为IBOutlet,则在调用viewDidLoad方法之前,您的文本字段将为nil(因此您将委托设置为nil对象)。调用viewDidLoad时,字面意思是视图已加载,并且所有IBOutlets和IBActions都已连接并随时可用。

答案 1 :(得分:1)

假设您的类是UIViewController并且是从NIB加载的(因为您有一个IBOutlet),要覆盖的正确init方法是initWithCoder:(NSCoder*)decoder。现在发生了什么:

  1. iOS加载您的NIB文件并创建您的UIViewController
  2. 通过调用其initWithCoder:(NSCoder*)decoder方法创建UIViewController。
  3. initWithCoder做的第一件事就是调用init,然后调用你的代码,甚至解码NIB
  4. 因为它尚未解码NIB,您的textField IBOutlet尚未设置(如果您调试它,您应该能够看到它的值在您的init内为零) 。因此设置代理不会做任何事情。
  5. 最简单的方法是使用viewDidLoad方法设置您的委托;它不能在init中完成。但是,可以通过覆盖initWithCoder:来完成

    - (id)initWithCoder:(NSCoder*)decoder {
        self = [super initWithCoder:decoder];
        if (self)
            textField.delegate = self;
        return self;
    }
    

    这次你等到UIViewController的initWithCoder实现已经完成解码NIB,所以你的所有插座都已设置好。