如何在appdelegate中找到控制器

时间:2019-02-18 07:00:01

标签: ios xcode

我想为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,对吧?

2 个答案:

答案 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)

Select each tab View controller and click on Editor ->Embed->Navigation Controller

使用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
                    }
                }