我应该在哪种方法中设置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都已连接并可供您使用。
答
假设您的类是UIViewController并从NIB加载(因为您有一个IBOutlet),要覆盖的正确的init方法是initWithCoder:(NSCoder*)decoder
。这是怎么回事,现在:
- 的iOS载入你的NIB文件,并创建你的UIViewController
- 的UIViewController中通过调用其
initWithCoder:(NSCoder*)decoder
方法创建的。 -
initWithCoder
做的第一件事是在它已经解码了NIB之前,请致电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等所有的网点已设置。
完美无缺,谢谢。 – SaamJB