我已经设置了一个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];
}
}
答案 0 :(得分:0)
打破循环,你可以检查你试图用循环初始化的元素是否尚未加载
例如,如果您有一个名为“label”的视图
然后你的initWithCoder看起来像这样
-(id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self){
if(!self.label){
load the nib
}
return self;
}