2017-01-26 5 views
0

をアンラップしながら、私は、特定の識別子を持つストーリーボードで数viewcontrollersを持っていると私は、このようにそれらにアクセスしようとすると:致命的なエラービューコントローラ値

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let mainViewController = sideMenuController! 
    let vcName = identities[indexPath.row] 
    let viewController: UIViewController! = storyboard?.instantiateViewController(withIdentifier: vcName) 
    let navigationController = mainViewController.rootViewController as! NavigationController 
    navigationController.pushViewController(viewController, animated: true) 
    mainViewController.hideLeftView(animated: true, completionHandler: nil) 

} 

アプリがクラッシュします。この行は、値がnilであることを検出しています。アンラッピング中にどのようにこれが無しであるか誰も説明できますか?

navigationController.pushViewController(viewController, animated: true) 

いくつかの試みの後、私は致命的なエラーを取り除くことができました。ただし、テーブルビュー項目をタップしてもビューコントローラは表示されません。

  • オリジナルプロジェクト - link

  • 編集プロジェクト - link

+0

あなたは、UIViewControllerを置く必要がないとは言いませんでした。ストーリーボードの終わりに? instantiateViewController(name)! – SeanLintern88

+0

おそらく、 'storyboard?.instantiateViewController(withIdentifier:vcName)'は 'nil'を返します。 – shallowThought

+0

@ SeanLintern88非オプションのタイプをアンラップすることはできません。 –

答えて

0

まあ、プロジェクトが:-)

まず「めちゃくちゃ」少しあります何らかの形で「UINavigationController(または派生クラス)」を取得する必要があります。

LeftViewControllerはナビゲーションスタックにないため、navigationControllerが設定されていません。だから、あなたはmainViewControllerからそれを取得する必要があります:

識別子を持つビューコントローラ「」UINavigationControllerから派生した型EngineTunningParamteres、である:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    print(storyboard) 
    let mainViewController = sideMenuController! 
    let vcName = identities[indexPath.row] 
    let viewController: UIViewController! = storyboard.instantiateViewController(withIdentifier: vcName) 
    print(viewController) 
    if let theNavigationController = mainViewController.rootViewController as? UINavigationController { 
     print("Gotcha") 
     theNavigationController.pushViewController(viewController!, animated: true) 
     mainViewController.hideLeftView(animated: true, completionHandler: nil) 
    } 

} 

第二には、まだ問題があります。ナビゲーションコントローラを既存のナビゲーションコントローラにプッシュすることはできません。したがって、クラスも変更する必要があります。

class EngineTunningParamteres: UIViewController { 

    override func viewDidLoad() { 
     print("hi") } 

} 

これで動作します。どういたしまして。

+0

ありがとうございます。あなたが助けた致命的なエラーからトピックが転用されましたが! –

0
let viewController: UIViewController! 

は、Optionalあるこの!であなただけの私は、これはかもしれない知っている「コンパイラを言っています無期限だが心配しないでください。実行時には決して無限にならないでしょう。

あなたはこのOptionalを取り除きたい場合は、ストーリーボードをアンラップする必要があります:あなた:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let mainViewController = sideMenuController! 
    let vcName = identities[indexPath.row] 
    let viewController = storyboard!.instantiateViewController(withIdentifier: vcName) 
    let navigationController = mainViewController.rootViewController as! NavigationController 
    navigationController.pushViewController(viewController, animated: true) 
    mainViewController.hideLeftView(animated: true, completionHandler: nil) 

}