在 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 上的一个 UITableView 中加载两个不同的 nib