Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从nib加载自定义UIView时,nib中包含的所有子视图都为零?_Iphone_Ios_Uiview_Interface Builder_Nib - Fatal编程技术网

Iphone 从nib加载自定义UIView时,nib中包含的所有子视图都为零?

Iphone 从nib加载自定义UIView时,nib中包含的所有子视图都为零?,iphone,ios,uiview,interface-builder,nib,Iphone,Ios,Uiview,Interface Builder,Nib,我有一个自定义的UIView对象,它带有一个定义视图/子视图布局的nib。我的插座已连接,当我从initWithFrame:初始化对象时,一切正常 我遇到的问题是,当我使用IB将UIView嵌入到另一个nib中时;自定义UIView将出现,但其中包含的子视图都不会出现-事实上,它们的符号都解析为nil。我有一个非常小的initWithCoder:和awakeFromNib:实现(只做日志记录),我的理解是,当nib被反序列化时,子视图至少应该在这个过程中被初始化 我自己得出的唯一结论是,发生了两

我有一个自定义的
UIView
对象,它带有一个定义视图/子视图布局的
nib
。我的插座已连接,当我从
initWithFrame:
初始化对象时,一切正常

我遇到的问题是,当我使用IB将
UIView
嵌入到另一个nib中时;自定义
UIView
将出现,但其中包含的子视图都不会出现-事实上,它们的符号都解析为nil。我有一个非常小的
initWithCoder:
awakeFromNib:
实现(只做日志记录),我的理解是,当nib被反序列化时,子视图至少应该在这个过程中被初始化

我自己得出的唯一结论是,发生了两件事中的一件:要么我的出口引用已损坏/不好,无法工作,要么我对nib进程的负载理解有误,我遗漏了一些东西

提前谢谢

编辑:(按要求为Nekto发布代码……正如您将看到的,它会记录日志,就是这样,呵呵。)

编辑2:笔尖、控制器、子视图等

笔尖:我有一个包含UIView的笔尖。此UIView包含一个UIScrollView,其中填充了在另一个nib中定义的UIView网格。(注意:这部分工作正常,因为填充是以编程方式完成的,并且与initWithFrame:call一起工作。)这里的问题是,在initWithCoder:和awakeFromNib:都被调用之后,UIScrollView符号是nil,因此对象只是被添加到nil中,什么也没有发生。如果scrollview符号不是零,我相信这会起作用

控制器:有两个控制器利用此功能,一个是使用initWithFrame:完成的,并且工作完美,另一个将其作为基于nib的引用嵌入。(正如在这里的其他地方提到的,在IB中定义UIView,设置自定义类。)我仔细阅读了代码,并且该视图-正在正确初始化-只有其子视图“丢失”


这有助于更清楚地了解情况吗?

检查是否在每个重写的方法中调用initWithCoder:和awakeFromNib的“super”实现,即

- (id)initWithCoder:(NSCoder *)decoder {
    if ((self = [super initWithCoder:decoder])) {
      ...your init code...
    }
    return self;
}

- (void)awakeFromNib {
     [super awakeFromNib];
     ...your init code...
}

您可能误解了nib加载的工作原理。如果定义自定义UIView并创建一个nib文件来布局其子视图,则不能将UIView添加到另一个nib文件中,将IB中的类名更改为自定义类,并期望nib加载系统能够解决这个问题。您需要修改自定义UIView类的initWithCoder,以编程方式加载定义其子视图布局的nib。e、 g:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];
        [self addSubview:self.toplevelSubView];
    }
    return self;
}
自定义视图的nib文件需要将“文件的所有者”类设置为自定义视图类,并且需要在自定义类中有一个名为“toplevelSubView”的出口,该出口连接到自定义视图nib文件中的视图,该视图充当所有子视图的容器。向视图类添加其他插座,并将子视图连接到“文件的所有者”(自定义UIView)


或者,只需以编程方式创建自定义视图并绕过IB。

只有在您发布一些代码的情况下,我们才能为您提供帮助。您可以从创建自定义子视图的位置开始,
initWithFrame:
和其他。我应该注意,我的自定义子视图实际上只是在IB nib中为管理它的viewcontroller定义的。(设置UIView位置、更改其自定义类等)我认为问题不在目标C代码中(除了缺少对[super awakeFromNib]的调用)。我们需要知道项目中有哪些nib文件,每个nib中定义了哪些视图控制器和视图,以及如何在另一个nib中“嵌入”自定义视图;尽管添加了调用,但仍然没有给我对象的有效引用。我仍然担心我错误地假设nib中定义的子视图是自动创建的。。。尽管这种想法有点违反直觉,但还是有一些出口。谢谢罗宾,这彻底消除了我的不确定性和我的问题;我认为对mainBundle的调用是隐式的,并在initWithFrame:methods中显式地进行了调用。这解决了一切,再次感谢!但这有点牵强。我的意思是,当我在xib中设置子视图标记号并且Nib已加载时,我可以通过调用例如[cell viewWithTag:]来访问子视图。幸运的是,有一种方法可以检索属性并以编程方式访问它们,但是如果它们不是呢?当它们连接到任何属性或IVAR时,是否也有办法以某种方式访问视图?我希望视图子类中的所有插座+我希望以编程方式从其XIB加载这些子视图。我遵循了上面的方法,但我不知道如何在没有脚本的情况下初始化viewcontroller中的视图。loadNIBNamed from viewcontroller使用上述方法导致递归…怎么做?@JonRamvi如何修复无限循环?
- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];
        [self addSubview:self.toplevelSubView];
    }
    return self;
}