2016-04-04 30 views
0

Yapılacaklar listesi oluşturmak için bir eğiticiyi takip ediyorum. Halihazırda 2 Set Tablosu Denetleyicisini (WeekAViewController - item # 1 & WeekBViewController - madde 2) yöneten bir Tab Çubuğu Görünümü Denetleyicisi var.Sekme Bağlantısı Çubuk Denetleyici

: - Şimdi

, ben AllListsViewController benim Tab Bar View Controller bağladığınızda (benim 3 seti veya öğe haline kod aşağı altındadır), ben hata ayıklama penceresinde aşağıdaki mesaj benim AppDelegate işaret olsun 'UITabirController' (0x1ad56a0) 'UINavigationController' (0x1ad5678) 'a kadar değer atanamaz. (lldb)

Bu sorunu nasıl giderebilirim, lütfen? (Aşağıdaki App Delege kodu)

Teşekkür

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() 
    } 

} 

cevap

1

(kod açıklamalarda olan ipuçları) Bu deneyin ve application(_:didFinishLaunchingWithOptions:) koymak:

// 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 
} 

Edit Yorumlar ilişkin (ipuçları kod açıklamalarda bulunmaktadır):

// 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

Denedim ve şu iletiyi aldım: 'UINavigationController' (0x1b41cec) 'değeri' SchoolTime.AllListsViewController '(0x1daf58)' a dönüştürülmedi - herhangi bir düşünce? – Laroms

+0

Baskıyı "" ("TabBarViewControllers: \ (tabBarViewControllers))") ile engellerseniz ve buna ekledikten sonra uygulamanızı başlattığınızda hangi çıktıyı elde ederseniz sekmesindeki tabBarViewControllers öğesini basabilir misiniz? – ronatory

+0

aşağıdaki çıktıyı almak: TabBarViewControllers: [, , ] türünün değerini 'SchoolTime.AllListsViewController' için 'UINavigationController' (0x1b0bcec) (0x1a4f58) kovamadık . (lldb) Tamam – Laroms

0

Sizin ana UITabBarController bir UINavigationController değildir. UIViewController'dan, UINavigationController gibi. Bir UINavigationController bir UITabBarController döküm olamaz çünkü

let navigationController = window!.rootViewController as! UINavigationController 

yazamaz demek hangi. Sen

let tabBarController = window!.rootViewController as! UITabBarController 

denemek ve sonradan TabBarController kullanabilirsiniz.

0

Neyi yanlış yaptınız buradaydı:

let navigationController = window!.rootViewController as! UINavigationController 

Hata, UITabBarController'un adresindeki 'a dönüştürülemeyeceğini veya dönüştürülmediğini söylüyor. Burada tam olarak ne yapıyorsunuz.

Hikaye panosunda, 3 (tablo) kontrol denetleyicisini sekme çubuğu denetleyicisine bağladığınızı söylediniz. Uygulama başlangıç ​​noktasının sekme çubuğu denetleyicisinde olduğunu varsayalım. Bu, window!.rootViewController'un UITabBarController olduğunu gösterir!

Şimdi neler olduğunu biliyoruz, bu hatanın neden oluştuğunu görelim. Nedeni basit, sen olmayan bir şeye bir şey atıyorsun. window!.rootViewController, UITabBarController tipindedir, değil mi? Peki neden onu UINavigationController'a gönderiyorsun? Bunlar tamamen iki farklı şey!eğer daha güvenli olabilir, ayrıca

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

: Ayrıca

let navigationController = window!.rootViewController as! UITabBarController 

, sana değişken isimlerini değiştirmek gerektiğini düşünüyorum:

Dolayısıyla, sadece yerine UITabBarController, yapılacak tek şey dökme, hatayı düzeltmek için yerine as?

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!") 
} 

Uyarı: Bu deneyin as! burada mı? Bu, cast başarılı olmadığında sıfır olur. Daha sonra nil olduğunu kontrol etmek için isteğe bağlı bağlamayı kullandım. Eğer öyleyse, bir mesaj veya bir şey çıkar.