在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;
}
答案 0 :(得分:3)
如果您的文字字段为IBOutlet
,则在调用viewDidLoad
方法之前,您的文本字段将为nil
(因此您将委托设置为nil
对象)。调用viewDidLoad
时,字面意思是视图已加载,并且所有IBOutlets和IBActions都已连接并随时可用。
答案 1 :(得分:1)
假设您的类是UIViewController并且是从NIB加载的(因为您有一个IBOutlet),要覆盖的正确init方法是initWithCoder:(NSCoder*)decoder
。现在发生了什么:
initWithCoder:(NSCoder*)decoder
方法创建UIViewController。initWithCoder
做的第一件事就是调用init
,然后调用你的代码,甚至解码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,所以你的所有插座都已设置好。