加载2个Xib,一个来自Xib,在被枚举和错误类型时被变异

时间:2012-02-24 16:33:10

标签: xib nib

所以,我有很多问题,每个问题都有答案,但没有结合。 我正在以两种方式加载Xibs。感谢Yang,我正在使用awakeAfterUsingCoder:(NSCoder *)aD {}并且可以获得自定义视图的初始加载(其中包含带有自定义视图的滚动视图)。

然后加载内部视图,使用[NSBundle] ... loadNibNamed:@“Name”] objectAtIndex:0]以编程方式从Xib加载。

到目前为止,我已成功通过代码加载Xib,并在Xib中加载Xib(除了AwakeAfter之外没有额外的代码)。好吧,好......但是......

稍后,当我通过使用loadNib ...选项向scrollView添加一个迷你视图时......我得到了这个:错误代码...在枚举时发生了变异。

什么?所以我显然正在修改我的数组,(最初我认为它是在添加时枚举滚动视图子视图,但不是......我不是那么粗心)。好吧是并发吗?不,我直接循环,并呼吁代表说“嘿,我改变了数据,现在添加到子视图。”但不是这样,老实说......你会喜欢这个: 我们假设我已经将我的观点命名为。 BigScrollView(保存内部视图)然后这...... InnerView * iv;

然后我做这样的事情:InnerView * temp = [[[NSBundle mainBundle] loadNibNamed:@“InnerView”owner:self options:nil] objectAtIndex:0];甚至有时候也会对它进行强制转换。然后,在它崩溃之前,我决定     NSLog(@“Class:%@”,NSStringFromClass([temp class])); 猜猜什么印刷品? BigScrollView。甚至调试它并使用PO objectName。

这是怎么发生的?

进一步搜索已经产生了结果:“每次在每个视图上调用AwakeFromNib,你从Nib加载,如果你加载一个新的笔尖,你所有的老笔也都会接到电话”。嗯,这很奇怪......但后来我意识到这可能,并且确实意味着......

  • (id)awakeAfterUsingCoder:也叫。这意味着,当我使用InnerView的加载调用时,它会自动调用BigScrollView:awakeAfterUsingCoder:

用NSLogs进一步检查后,我说得对。

所以我推了这条线     if(![self isKindOfClass:[BigScrollView class]])return self;

只是为了防止它创建一个新的BigScrollView(实际类型不同,只是fyi,我真的需要定制它的内容)。

但那不起作用。

我是使用Native iOS的主要支持者,因为它的速度和使用Xibs自定义的能力。所以不要误解我的意思,我批评他们没有沉重的感情,经常挑剔手册,比如没有解释MKMapRect,除非你查看WWDC 2010,或者UIScrollView在其规格中“应该”,只是因为我真心希望更好地理解它们并使用工具...所以我用一颗轻松的心说:苹果怎么能让它不仅可以说“int num”并且收到一个浮点数,但多线程的东西没有被问到?是否有一个我没有得到的一般过程?

我可能不会用xib实例化Xib并通过代码调用它们,只需手动放置它,看看是否有效。但我对任何答案持开放态度,因为我没有在SO上找到这个问题的复合。

1 个答案:

答案 0 :(得分:1)

对于每个实例化的视图,为活动窗口中的每个视图调用一次awakeFromNib。换句话说,使用静态变量来阻止2次调用。即使这样,编写我自己的初始化代码也比Apple的预制解决方案更好。

另请注意,通常这样做,当您知道每个视图只调用一次时,将初始化推送到此函数中: - (void)didMoveToSuperview {}或Window func