这是这个问题的后续(使用 IB / Xcode 4.5.1 和 iOS Simulator 6.0 自定义 UIView 操作方法)但没有必要阅读 - 这是我第一次尝试创建自定义 UIView ,并且显然有一些东西我没有提前得到,谢谢您可以提供的任何帮助。
我有一个源自 Interface Builder 的自定义 UIView。我想将设置尺寸设置为 200w x 200h,将背景颜色设置为绿色。当我创建时,我做了以下事情:
- 通过文件 -> 新建 -> Objective-C 类创建了一个新的自定义 UIView,名为 Tview
- 通过文件 -> 新建 -> 用户界面 -> 视图创建了一个新视图并将其命名为 tnib
- 在画布中,我删除了视图并从对象检查器中添加了一个新视图,并将类名称设置为 Tview。另外,在属性检查器中,我将大小设置为自由形式,并将背景颜色设置为绿色。在 Size Inspector 中,我将宽度设置为 200,高度设置为 200。
在我的 Tview.m 中,我设置了以下内容(我根据其他 SO 问题进行了一些更新,但不清楚这些是否仍然是最新的或准确的):
@implementation Tview
-(id) initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"in initWithCoder");
if((self = [super initWithCoder:aDecoder])) {
[self setUpView];
}
return self;
}
-(void)awakeFromNib
{
NSLog(@"in awakeFromNib");
[self setUpView];
}
-(void)setUpView
{
NSLog(@"I am in setUpView");
NSArray *subviewArray=[[NSBundle mainBundle] loadNibNamed:@"tnib" owner:self options:nil];
UIView *mainView = [subviewArray objectAtIndex:0];
[self addSubview:mainView];
}
@end
在我的 ViewController.xib 中,我拖出一个 UIView 并将自定义类名称设置为 Tview。我 #import Tview.h 文件并将 ViewController.xib 拖动到 Tview.h 并创建以下属性:
@property (strong, nonatomic) IBOutlet Tview *myTview;
我构建并运行并获得以下无限循环:
2013-03-04 06:49:05.452 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.455 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.456 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.458 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.459 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.460 Nibtest2[44524:11303] I am in setUpView
直到它最终崩溃。
我在这里做错了什么?
提前谢谢
您的代码设置了无限递归:initWithCoder:
calls setUpView
,它实例化了一个新的UIView
来自捆绑,从而调用initWithCoder:
间接完成循环。
您不应在读取同一 NIB 时调用的代码中访问该 NIB。您应该在包含对象的代码中读取 NIB,而不是在Tview
对象本身。否则,就会陷入无限循环。
您需要远程setUpView
总共,以及来自awakeFromNib
和initWithCoder:
。看来您通过从对象检查器中拖出而在界面生成器中建立的连接已经导致 NIB 文件正确加载,如调用所示initWithCoder:
。您可能需要的唯一一行是:
[self addSubview:mainView];
然而,它不应该出现在Tview
的代码:需要将其移动到具有myTview
属性,并且应该修改为
[self.view addSubview:_myTview];
将此行添加到viewDidLoad
。它应该解决这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)