2016-09-22 10 views
2

私が何かばかげていることを祈っていれば私を許してください。私はこのチュートリアルビデオの助けを借りてMMDrawerControllerを統合しようとしています。チュートリアルでAppDelegate(vs viewDidLoad)のUIブートストラップコードでルートビューコントローラを選択

https://www.youtube.com/watch?v=c-Uwa5v_3sc

、次のコードは、アプリデリゲート

var window :UIWindow = UIApplication.sharedApplication().keyWindow! 
     let rootViewController = window.rootViewController 
     let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let centerViewController = mainStoryboard.instantiateViewControllerWithIdentifier("Category") as! Category 
     let leftViewController = mainStoryboard.instantiateViewControllerWithIdentifier("Menu") as! Menu 

     let leftSideNav = UINavigationController(rootViewController: leftViewController) 
     let centerNav = UINavigationController(rootViewController: centerViewController) 

     centerContainer = MMDrawerController(centerViewController: centerNav, leftDrawerViewController: leftSideNav) 
     centerContainer!.openDrawerGestureModeMask = MMOpenDrawerGestureMode.PanningCenterView; 
     centerContainer!.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.PanningCenterView; 
     window.rootViewController = centerContainer 
     window.makeKeyAndVisible() 

に追加されますが、私はそれはアプリがcenterViewControllerで始まりますが、私はどのようなこと振る舞い私はそうしないことを行うときこのコードをcenterViewControllerのviewDidLoad()に移動しました。このコードは接続してクラスを開始するだけですが、これは間違っていると思います。

また、あなたの情報については、コレクションビューのセルのタップでこのコードを介してcenterViewControllerを呼び出しています。

var DestViewController = segue.destinationViewController as! UINavigationController 
      let targetController = DestViewController.topViewController as! Category 

このコードが呼び出されるとすぐに、アプリケーションのフリーズやRAMの使用がクラッシュするまで増加し続けます。

ログをviewDidLoad()に入れて、再帰的に呼び出されていることがわかりました。いずれか1つ私はこの問題を解決する方法をお勧めします。

ありがとうございます。

更新:

のviewDidLoad機能は、この

override func viewDidLoad() { 
     super.viewDidLoad() 
     // 
     print("Inside Category") 
     var window :UIWindow = UIApplication.sharedApplication().keyWindow! 
     print("1") 
     let rootViewController = window.rootViewController 
     print("2") 
     let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     print("3") 
     let centerViewController = mainStoryboard.instantiateViewControllerWithIdentifier("Category") as! Category 
     print("4") 
     let leftViewController = mainStoryboard.instantiateViewControllerWithIdentifier("Menu") as! Menu 

     let leftSideNav = UINavigationController(rootViewController: leftViewController) 
     let centerNav = UINavigationController(rootViewController: centerViewController) 

     centerContainer = MMDrawerController(centerViewController: centerNav, leftDrawerViewController: leftSideNav) 
     centerContainer!.openDrawerGestureModeMask = MMOpenDrawerGestureMode.PanningCenterView; 
     centerContainer!.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.PanningCenterView; 
     window.rootViewController = centerContainer 
     print("5") 
     // window.makeKeyWindow() 
     window.makeKeyAndVisible() 
     print("6") 
     // 
     let tapGestureRecognizerCat = UITapGestureRecognizer(target:self, action:#selector(Category.btnCategoryTapped(_:))) 
     btnCategory.userInteractionEnabled = true 
     btnCategory.addGestureRecognizer(tapGestureRecognizerCat) 
     // 
     let tapGestureRecognizerSearch = UITapGestureRecognizer(target:self, action:#selector(Category.btnSearchTapped(_:))) 
     btnSearch.userInteractionEnabled = true 
     btnSearch.addGestureRecognizer(tapGestureRecognizerSearch) 
     print("7") 
    } 

ように書きのStackTrace

Inside Category 
1 
2 
3 
4 
5 
6 
7 
Inside Category 
1 
2 
3 
4 
5 
6 
7 
Inside Category 
1 
2 
3 
4 
5 
6 
7 ... and keeps on going like this. 
+0

質問を再帰的に呼び出されている 'viewDidLoad'メソッドで更新してください。また、再帰を示すスタックトレースをポストする。 – rmaddy

+0

@rmaddy質問が更新されました。 –

+1

なぜ 'viewDidLoad'のウィンドウで何かしていますか?それは意味をなさない。 'viewDidLoad'は、View Controllerのビューに必要な設定だけを行う必要があります。それでおしまい。そこの窓に触れないでください。 – rmaddy

答えて

0

viewDidLoad()UIWindow/AppDelegateのスタートアップコードの移動、間違いなく "コーディングショットガンによる" アプローチで、本質的ですView Controllerにロード完了後すぐに再ロードするように要求します。

概念レベルでは、アプリケーションライフサイクルとView Controllerのライフサイクルを学ぶ必要があります。これについては、まともなApple開発者の記事があります。私はあなたに検索を残します。

代わりに、ストーリーボードの起動メカニズムをオーバーライドする場合(あなたが何をしているのかを確認してください。準備が整っていない沼地に忍び寄っているように見えます)、App DelegateどのView Controllerが必要なエントリポイントであるかを示します。あなたが見ているのは、ストーリーボード(ビューコントローラの属性インスペクタ)にある「初期ビューコントローラです」チェックボックス/右向き矢印のコードバージョンです。もちろん、コードはこのストーリーボードの設定を無視しているので、コードで綴る必要があります。

だから、それは次のようになります。

let viewControllerInstanceThatIReallyWant = mainStoryboard.instantiateViewControllerWithIdentifier("TheStoryBoardIDofTheViewControllerThatIReallyWant") as! ClassOfViewControllerThatIReallyWant 

... 

window.rootViewController = viewControllerInstanceThatIReallyWant 

そしておそらく、ClassOfViewControllerThatIReallyWantは、ストーリーボードでのVCのアイデンティティである、と何とかあなたが設計したものは何でもナビゲーションを経由して、関連するCategoryビューコントローラにつながります。

+0

私は確かにドキュメントを探します。 :) –

関連する問題