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

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

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

要么

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

如果你的文本字段是一个IBOutlet那么直到viewDidLoad方法被调用,你的文本字段将是nil (因此你把委托设置nil对象)。 当viewDidLoad被调用时,它的字面意思是视图被加载,所有的IBOutlets和IBActions都被连接起来,并在您的处置。

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

  1. iOS加载你的NIB文件并创build你的UIViewController
  2. 通过调用它的initWithCoder:(NSCoder*)decoder方法来创buildUIViewController。
  3. initWithCoder做的第一件事就是在它甚至解码了NIB之前调用init ,因此调用你的代码。
  4. 因为它还没有解码NIB,你的textField IBOutlet还没有设置(如果你debugging它,你应该能够看到它的值是你的init里面的零)。 因此,设置代表什么也不做。

最简单的方法是将您的委托设置在viewDidLoad方法中; 它不能在init完成。 但是可以通过覆盖initWithCoder来完成:

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

这一次,你等到UIViewController的initWithCoder的实现已经完成解码的NIB,所以你所有的网点已经设置。