我应该在哪种方法中设置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
。 现在发生了什么事情:
- iOS加载你的NIB文件并创build你的UIViewController
- 通过调用它的
initWithCoder:(NSCoder*)decoder
方法来创buildUIViewController。 -
initWithCoder
做的第一件事就是在它甚至解码了NIB之前调用init
,因此调用你的代码。 - 因为它还没有解码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,所以你所有的网点已经设置。