编辑:重新输入相同的问题,使其更具体。
我的程序中有3个类。App Delegate包含:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.controller = [[InitialEdit alloc]initWithNibName:@"InitialEdit"];
self.window.rootViewController = self.controller;
然后InitialEdit:
-(InitialEdit*) initWithNibName:(NSString*) xibName{
self.menu = [[DropDownMenu alloc]initWithNibName:@"DropDownMenu" size:230];
self.menu.view.frame = CGRectMake(0, 20, 0, 100);
self.menu.view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:self.menu.view];
return [self initWithNibName:xibName bundle:nil];
}
和DropDownMenu-(DropDownMenu*) initWithNibName:(NSString*) xibName size:(int)size{
//……没有相关的按钮代码,没有帧变化
return [self initWithNibName:xibName bundle:nil];
}
所以从逻辑上讲,宽度为0会使框架不可见,但宽度为~55左右,我看到的是橙色。我该如何解决这个问题?
我认为问题出在这一行:return [self initWithNibName:xibName bundle:nil];
在你的代码中发生的事情是,你在self
上设置了一些没有完全初始化的东西(意思是,init
链还没有上升到NSObject
),然后你通过调用[self initWithNibName:xibName bundle:nil]
返回一个全新的InitialEdit
实例。
正确的做法是:
-(InitialEdit*) initWithNibName:(NSString*) xibName{
self = [super initWithNibName:xibName bundle:nil];
if (self) {
self.menu = [[DropDownMenu alloc]initWithNibName:@"DropDownMenu" size:230];
self.menu.view.frame = CGRectMake(0, 20, 0, 100);
self.menu.view.backgroundColor = [UIColor orangeColor];
[self.view addSubview:self.menu.view];
}
return self;
}
当然,这假定您没有在类中覆盖initWithNibName:bundle:
。即便如此,一般的经验法则是,自定义初始化器的第一行应该将self
赋值给其他初始化器的result,从而在某个时候调用super
的一个初始化器。