我刚刚看到一个非常奇怪的问题,我的视图将忽略来自自定义视图的所有委托调用,因为我在加载时在项目上调用了alloc / init。我很好奇为什么。
@synthesize customTextField;
-(void)viewDidLoad {
// by calling this alloc/init, none of the changes here actually update to the view
// everything is ignored from here on in.
// if I comment out the alloc/init line, everything works fine
self.customTextField = [[UITextField alloc] init];
self.customTextField.text = @"Some text";
// setting font and size as well
}
虽然我仍然可以调用文本字段委托方法,但没有一个链接到我的特定文本字段。我无法仅对
customTextField
做出回应。我确实意识到调用alloc / init会给我一个
customTextField
的全新实例...但是为什么不将该新实例链接到IB和我的视图? 最佳答案
因为IB linking != binding
。
当您在IB中链接变量时,只需在第一次加载时设置一次变量即可。它没有其他特殊代码可以跟踪其任何更改,这是有充分的理由的。
例如:
您正在设计UITableViewCell
,并且如果选择了一个单元格,则必须重新排列该单元格内的所有内容。在这种情况下,您确定如果重新创建所有子视图并将它们重新添加到视图中会更容易,所以您可以执行以下操作:
-(void) layoutSubviews {
if (cellIsSelected)
{
// custom button is an IBOutlet property, which is by default a subview of self
self.customButton = [UIButton buttonWithType:UIButtonTypeCustom];
[[self someSubView] addSubview:customButton];
}
else {
// where is customButton located now? is it a subview of self or `someSubView`?
self.customButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
// [self addSubview:customButton];
}
}
因此,IB尝试说
let's set this once, and let the programmer figure the rest out
比IB尝试跟踪对对象所做的所有更改并将其报告给UI容易得多。关于ios - viewDidLoad中的alloc/init导致IB忽略 socket ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11604935/