我目前正在编写一个应用程序,我遇到了一个问题,这个问题似乎是由我没有编写的代码(即Apple的类)引起的。我创建了一个我编写的UIViewController
子类的实例。我将其添加为另一个自定义视图控制器的子视图控制器。然后,当我尝试将此新视图控制器的视图添加为父视图控制器视图的子视图时,我遇到此错误的崩溃。
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
我已经测试并确定该问题是通过尝试将视图添加为子视图而引起的。我在NSLog
中引用视图只是为了确保它不仅仅是引用它的行为导致了错误。我尝试将视图添加为不同视图的子视图,但这也崩溃了,因此问题不在于父视图。最后,我尝试将不同的视图作为子视图添加到父视图中,这确实有效,进一步证明父视图很好,并且预期的子视图有问题。我分配它的代码是这样的:
ScheduleSelectorViewController* selector = [[ScheduleSelectorViewController alloc] initWithNibName:@"ScheduleSelectorViewController" bundle:nil];
这一直对我有用。我不知道我改变了什么。我对子视图层次结构的内部工作原理不够了解,无法知道哪个数组为空并导致此崩溃,因此如果有人可以帮助我,我将不胜感激。
如果我可以提供任何其他有助于告诉我的信息。
更新:
这是它崩溃的代码。我放置了NSLogs来指示它中断的行。
- (void) addViewControllerToStack:(UIViewController *)controller withKey:(NSString *)key
{
if ( !self.stack ) {
self.stack = [[NSMutableDictionary alloc] init];
}
NSLog(@"subviews %@", [controller.view subviews]);
[[controller view] setFrame:offScreenFrame];
[self addChildViewController:controller];
NSLog(@"code gets to here");
[self.view addSubview:controller.view];
NSLog(@"but not to here");
[self.view bringSubviewToFront:controller.view];
[self.stack setObject:controller forKey:key];
[self.stackKeys addObject:key];
}
作为记录,子视图数组不是 nil。
检查您是否在某处设置了视图的.hidden = YES;
我拉扯了我的头发一个多小时,发现我隐藏了我的寻呼机控件,并尝试稍后设置 pageIndicatorTintColor
属性,这也抛出了数组越界问题。
未调用super
方法的情况下未在ScheduleSelectorViewController
中重写init
/initWithNibName
方法。
当然,您可以随时在控制台中为父视图打印出[self.view subviews]
,以了解子视图数组是否nil
。如果它为 nil,则应在添加任何视图之前启动它。