尝试从IB中的xib创build自定义视图的无限循环

这是这个问题的后续( 自定义UIView如何与IB / Xcode 4.5.1和iOS模拟器6.0 ),但没有必要阅读 – 这是我第一次尝试创build一个自定义的UIView,显然是东西我没有提前得到任何帮助,你可以提供。

我有一个从Interface Builder派生的自定义UIView。 我想设置的大小为200W×200H和背景颜色为绿色。 当我创build我做了以下:

  1. 通过File – > New – > Objective-C Class创build一个新的自定义UIView,称为Tview
  2. 通过文件 – >新build – >用户界面 – >视图创build一个新的视图,并将其称为tnib
  3. 在canvas中,我删除了视图,并从对象检查器添加了一个新的视图,并将类名设置为Tview。 此外,在属性检查器中,我将大小设置为自由格式,将背景颜色设置为绿色。 在尺寸检查器中,我将宽度设置为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。 我#导入Tview.h文件并从ViewController.xib拖到Tview.h并创build以下属性:

 @property (strong, nonatomic) IBOutlet Tview *myTview; 

我build立和运行,并得到一个无限循环如下:

 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 

直到它最终崩溃。

我在这里做错了什么?

thx提前

你的代码设置了一个无限recursion: initWithCoder:调用setUpView ,它从一个bundle实例化一个新的UIView ,从而间接调用initWithCoder: ,并完成循环。

在读取相同的NIB时,不应该访问被调用的代码中的NIB。 您应该在包含对象的代码中读取NIB,而不是在Tview对象本身的代码中。 否则,你会得到一个无限的周期。

您需要远程执行setUpView ,以及来自awakeFromNibinitWithCoder:调用。 看起来,通过从对象检查器中拖出来在界面构build器中进行的连接已经导致NIB文件正确加载,如通过调用initWithCoder: 。 唯一可能需要的是这样的:

 [self addSubview:mainView]; 

但是,它不应该在Tview的代码中:它需要移动到具有myTview属性的父控制器,并且应该修改为

 [self.view addSubview:_myTview]; 

将此行添加到viewDidLoad 。 它应该照顾这个问题。

其实我对这个问题的解决方法是,加载在我的CustonViewController viewDidLoad视图中,我想要使用这样的视图:

 myAccessoryView = NSBundle.mainBundle().loadNibNamed("MyAccessoryView", owner: self, options: nil)[0] as! MyAccessoryView 

不要在loadView()方法中加载视图! loadView方法用于为您的自定义ViewController加载视图。