在 nib 文件中加载 nib 文件

Posted

技术标签:

【中文标题】在 nib 文件中加载 nib 文件【英文标题】:Loading a nib file within a nib file 【发布时间】:2014-02-17 20:17:07 【问题描述】:

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

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];

【问题讨论】:

【参考方案1】:

要跳出循环,您可以检查您尝试使用循环初始化的元素是否尚未加载

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

那么您的 initWithCoder 将如下所示

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

            
      return self;


【讨论】:

以上是关于在 nib 文件中加载 nib 文件的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 包中加载 Nib 文件的更快方法?

无法在包中加载 NIB:NSBundle

在 iOS 上的一个 UITableView 中加载两个不同的 nib

无法在包中加载 Nib - 错误的 nibname 错误

MonoTouch <--> 静态库异常:无法在包中加载 NIB

从框架加载 nib 文件