我想为appdelegate中名为CategoryPickerViewController的控制器初始化dataModel。 但是我无法正确获取目标控制器。 控制台不断告诉我
未捕获的异常'NSRangeException',原因:'***-[__ NSSingleObjectArrayI objectAtIndex:]:索引2超出范围[0 .. 0]'
我知道2索引有问题,但我不知道如何解决。
我可以使用“ viewControllers.first”或“ [0]”找到第一个控制器
let tabController = window!.rootViewController as! UITabBarController
if let tabViewController = tabController.viewControllers {
let navController = tabViewController[0] as!
UINavigationController
let controller = navController.viewControllers[2] as!
CategoryPickerViewController
controller.dataModel = dataModel
为appdelegate storyboard here中名为CategoryPickerViewController的控制器初始化dataModel。
上面链接中的这张照片是我的故事板。 根据你们的帮助我的好人。我认为问题是由于没有将控制器作为子控制器而造成的,所以我只是无法通过for循环来捕获我的控制器。而父控制器是我从未知道的知识以前学过。也许我现在需要学习。
my controllers view in x-mind 这张照片更清晰
根据@MShah,我打印了navcontroller [0]的控制器,结果为“ MyLocations.CurrentLocationViewController:0x7fd13506fc00”
所以CatelogePickerVC实际上不属于navcontroller,对吧?
答案 0 :(得分:0)
永远不要使用强制类型转换。您得到的错误是您正在访问数组中的超出范围(大于/小于数组中存在的值)索引。也许这个例子可以帮助您:-
if let tabController = self.window.rootViewController as? UITabBarController {
for vController in tabController.viewControllers {
if vController is UINavigationController {
//Do anything with navigation controller
print("Navigation controller")
}else if vController is CategoryPickerViewController {
//Do anything with CategoryPickerViewController controller
print("CategoryPickerViewController controller")
}
}
}
根据屏幕截图进行编辑
if let tabController = self.window?.rootViewController as? UITabBarController,let controllers = tabController.viewControllers {
for vController in controllers {
if let navController = vController as? UINavigationController {
for subVc in navController.viewControllers {
if subVc is CategoryPickerViewController{
// Do the required stuff with CategoryPickerViewController
}
}
}
}
}
答案 1 :(得分:0)
使用for循环尝试这种方式,因此无需指定索引。如果导航控制器堆栈由类型类别选择器控制器的视图控制器组成,则它将能够安全地转换相同的对象:-
let tabController = window!.rootViewController as! UITabBarController
if let tabViewController = tabController.viewControllers {
let navController = tabViewController[0] as!
UINavigationController
//let controller = navController.viewControllers[2] as!
// SecondVC
for vc in navController.viewControllers {
if let controller = vc as? CategoryPickerViewController {
controller.dataModel = dataModel
}
}