在nib文件中加载nib文件

时间:2014-02-17 20:17:08

标签: ios objective-c xcode nib

我已经设置了一个nib文件,在一个更大的UIView元素中包含一些基本的UIView元素。两个元素是UIImageView类的子类(用于向用户显示数据的米)。无论如何,在我看来,我希望这些仪表是他们自己的nib文件,因为它们有许多视觉元素,为了理智,将仪表单独放在它自己的nib文件中会很不错。我还希望有一个控制器用于仪表和父nib文件中的其他基本元素。我已将父笔尖中的子计量笔尖对象设置为我的自定义类(比如UIMeter)。我在将子笔尖加载到父笔尖时遇到问题,当我覆盖UIMeter initWithCoder方法时,它会创建一个无限循环,因为我正在尝试使用loadnibnamed来访问子nib文件以进行加载。我也尝试从父控制器加载nib,但它从loadnibnamed加载子笔尖和nib。这可能会对代码和图像更有意义:

UIMeter代码,并不确定我甚至需要它,因为它会导致无限循环,但我希望视图可以足够智能以某种方式加载自身,但在阅读文档时似乎更适合这样做在视图的控制器中。

-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if(self)
{
    self = [[[NSBundle mainBundle] loadNibNamed:@"PowerMeterView" owner:self options:nil] firstObject];
}
return self;

}

在父控制器中,我正在拨打视图:

-(void)loadView
{
if(![self isViewLoaded])
{
    GameMenuView *menuView = [GameMenuView new];
    menuView.userEnergy = [[[NSBundle mainBundle] loadNibNamed:@"PowerMeterView" owner:self options:nil] firstObject];
    menuView.userReactor = [[[NSBundle mainBundle] loadNibNamed:@"PowerMeterView" owner:self options:nil] firstObject];
    _gameMenuView = menuView;
//--This places the child nib from the file on the view but it is not replacing the UIMeter in the parent nib
    [menuView.userEnergy setFrame:CGRectMake(0, 0, 20, 20)];
    [menuView addSubview:menuView.userEnergy];
    [self setView:menuView];
}

}

Child nib file PowerMeterView.xib Parent nib file, the red boxes are the two meter subclass placeholders

1 个答案:

答案 0 :(得分:0)

打破循环,你可以检查你试图用循环初始化的元素是否尚未加载

例如,如果您有一个名为“label”的视图

然后你的initWithCoder看起来像这样

-(id) initWithCoder:(NSCoder *)aDecoder{
     self = [super initWithCoder:aDecoder];
       if (self){
            if(!self.label){
               load the nib

            }
      return self;

}