0

我刚刚目睹了一个非常奇怪的问题,我的视图将忽略来自自定义视图的所有委托调用,因为我在加载时对项目调用了 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 和我的视图?

4

3 回答 3

2

因为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];
    }
}

let's set this once, and let the programmer figure the rest out因此,与 IB 尝试跟踪对对象所做的所有更改并将其报告给 UI 相比,IB说起来要容易得多。

于 2012-07-22T23:55:47.670 回答
2

viewDidLoad在您的 nib 加载后调用,此时创建一​​个新的 UITextField 实例将不会与您的 nib 关联。如果您手动设置新实例,您还需要手动设置委托,并将它们添加为视图的子视图。

于 2012-07-22T23:56:59.343 回答
1

XIB 文件无法知道您正在更改引用。考虑以下代码

NSObject *myObjA = [[NSObject alloc]init]; //create object
NSObject *myObjB = myObjA; //assign reference <- this is the your case after xib load 
myObjB = [[NSObject alloc]init]; //create object, myObjA still lives on.

加载 XIB 文件时发生的情况基本相同;您将获得对实例化对象的引用(在上面的示例中等于 myObjB)。您可以随心所欲地使用引用,但您不能仅通过创建新对象来更改接口实例。

于 2012-07-22T23:59:51.883 回答