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

问题描述:

在viewDidLoad或init方法中设置UITextField的委托是否是一种好的做法? 我试着在init方法中将委托设置为self,但是当我将代码移动到viewDidLoad中时,它没有调用相应的委托方法,它将自己设置为委托来注册? 看来我应该可以用任何一种方法来设置它,如果有人能帮我解决这个问题,我将非常感激。我应该在哪种方法中设置UITextField的委托?

-(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; 
} 

如果你的文本字段为IBOutlet然后直到viewDidLoad方法被调用您的文本字段将是nil(因此你将委托设为nil对象)。当viewDidLoad被调用时,它的字面意思是该视图已加载,并且所有IBOutlet和IBActions都已连接并可供您使用。

+0

完美无缺,谢谢。 – SaamJB

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

  1. 的iOS载入你的NIB文件,并创建你的UIViewController
  2. 的UIViewController中通过调用其initWithCoder:(NSCoder*)decoder方法创建的。
  3. initWithCoder做的第一件事是在它已经解码了NIB之前,请致电init,因此您的代码为
  4. 因为还没有解码的NIB的是,你的textField IBOutlet中还尚未设置(如果您调试它,你应该能够看到它的价值为零的init内)。因此设置代理不会执行任何操作。

最简单的处理方法的确是在viewDidLoad方法中设置您的代理;它不能在init中完成。然而,它可以通过重写initWithCoder来完成:

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

这个时候你等到UIViewController的实施initWithCoder已经完成解码NIB等所有的网点已设置。

+0

哪个是最符合iOS标准的?我应该在viewDidLoad中还是在initWithCoder中设置委托? – SaamJB

+0

你最应该在'viewDidLoad'中设置你的委托,因为当你的应用程序收到内存警告并且你的插座将会丢失(至少它应该在viewDidUnload中未设置)时,控制器的视图可能会被卸载。 – Eimantas