2016-04-04 5 views
0

Я слежу за учебником, чтобы создать список дел. У меня есть контроллер просмотра панели вкладок, который уже управляет двумя наборами контроллеров табличного представления (WeekAViewController - item # 1 & WeekBViewController - item 2).Подключение к контроллеру панели табуляции

Теперь, когда я подключить Tab Bar View Controller для AllListsViewController (стать моим третьим посаженные или вещь - код внизу), я получаю следующее сообщение в окне отладки, указывая на мой AppDelegate:

Не удалось присвоить значение «UITabBarController» (0x1ad56a0) в «UINavigationController» (0x1ad5678). (lldb)

Как я могу решить эту проблему, пожалуйста? (App Делегат код ниже)

Благодаря

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    let dataModel = DataModel() 


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

     let navigationController = window!.rootViewController as! UINavigationController 
     let controller = navigationController.viewControllers[0] as! AllListsViewController 
     controller.dataModel = dataModel 

     return true 
    } 

    ... 

    func applicationDidEnterBackground(application: UIApplication) { 
     saveData() 
    } 

    ... 

    func applicationWillTerminate(application: UIApplication) { 
     saveData() 
    } 

    func saveData() { 
     dataModel.saveChecklists() 
    } 

} 

ответ

1

Попробуйте это и поместить его в ваших application(_:didFinishLaunchingWithOptions:) (подсказки в комментариях к коду):

// first find the UITabBarController 
let tabBarController = window!.rootViewController as! UITabBarController 

// then look at its viewControllers array 
if let tabBarViewControllers = tabBarController.viewControllers { 
    // the reference to the AllListsViewController object 
    let allListsViewController = tabBarViewControllers[0] as! AllListsViewController 
    allListsViewController.dataModel = dataModel 
} 

Редактировать относительно к Комментарии (подсказки в комментариях к коду):

// first find the UITabBarController 
let tabBarController = window!.rootViewController as! UITabBarController 

// then look at its viewControllers array 
if let tabBarViewControllers = tabBarController.viewControllers { 

    // your AllListsViewController is in a NavigationController so get the right NavigationController 
    // you can see the order of your added NavigationControllers in your storyboard in your case its the third 
    // because tabBarViewControllers is an array the NavigationController where your AllListsViewController is, is at index 2 
    let navigationController = tabBarViewControllers[2] as! UINavigationController 

    // after you get the right NavigationController get the reference to your AllListsViewController 
    let allListsViewController = navigationController.viewControllers[0] as! AllListsViewController 
    allListsViewController.dataModel = dataModel 
} 
+0

Я попробовал это, и у меня появилось следующее сообщение: Не удалось передать значение типа «UINavigationController» (0x1b41cec) в «SchoolTime.AllListsViewController» (0x1daf58) - любые мысли? – Laroms

+0

Не могли бы вы напечатать tabBarViewControllers вверху в блоке if let с 'print (« TabBarViewControllers: \ (tabBarViewControllers) ») и какой вывод вы получите при запуске приложения после добавления этого? – ronatory

+0

я получаю следующий результат: TabBarViewControllers: [, , ] Не удалось бросить значение типа 'UINavigationController' (0x1b0bcec) к 'SchoolTime.AllListsViewController' (0x1a4f58) , (lldb) – Laroms

0

Ваш главный UITabBarController не является UINavigationController. Он наследует UIViewController, как UINavigationController. Что означает, что вы не можете писать

let navigationController = window!.rootViewController as! UINavigationController 

, потому что вы не можете бросить UITabBarController в UINavigationController. Вы можете попробовать

let tabBarController = window!.rootViewController as! UITabBarController 

и использовать tabBarController впоследствии.

0

То, что вы сделали неправильно, было здесь:

let navigationController = window!.rootViewController as! UINavigationController 

Ошибка говорит, что UITabBarController не может быть отлит или преобразован в UINavigationController, что составляет точно, что вы здесь делаете.

В раскадровке вы сказали, что подключили 3 (настольные) контроллеры вида к контроллеру просмотра панели вкладок. И я предполагаю, что начальная точка приложения находится на контроллере просмотра панели вкладок. Это означает, что window!.rootViewController является UITabBarController!

Теперь, когда мы знаем, что происходит, давайте посмотрим, почему эта ошибка произошла. Причина проста: вы бросаете что-то в нечто такое, чего нет. window!.rootViewController имеет тип UITabBarController, правильно? Итак, почему вы бросаете его на UINavigationController? Они полностью две разные вещи!

Таким образом, чтобы исправить ошибку, просто бросить вещь UITabBarController вместо:

let navigationController = window!.rootViewController as! UITabBarController 

Кроме того, я думаю, вы должны изменить имена переменных:

let tabBarController = window!.rootViewController as! UITabBarController 
let controller = navigationController.viewControllers[0] as! AllListsViewController 
... 

Кроме того, вы можете быть безопаснее, если вы пытаетесь:

let tabBarController = window!.rootViewController as? UITabBarController 
if let vc = tabBarViewController { 
    let controller = navigationController.viewControllers[0] as! AllListsViewController 
    ... 
} else { 
    print("The root view controller is not a tab bar controller!") 
} 

Обратите внимание, что вместо as?as! есть? Это вернет нуль, если приказ не будет выполнен. Затем я использовал необязательную привязку, чтобы проверить, нет ли она. Если это так, выведите сообщение или что-то еще.

Смежные вопросы