2017-07-11 8 views
1

現在、コントローラを公開するためにパンジェスチャを取得しようとしています。現時点では、私のopenボタンは機能しますが、最後の行を追加すると、revealViewControllerがnilなのでプログラムがクラッシュします。ポッドへのリンク:https://github.com/John-Lluch/SWRevealViewControllerSelf.revealViewController()はnilを返す

import Foundation 
    import UIKit 
    class MainViewController : UIViewController{ 
    @IBOutlet weak var mainButton: UIView! 
    @IBOutlet weak var Open: UIBarButtonItem! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 
    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated); 
     mainButton.makeCircle(); 
     Open.target = self.revealViewController() 
     Open.action = #selector(SWRevealViewController.revealToggle(_:)); 
     self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()); 
    } 
} 

答えて

2

それはあなたがrootViewControllerであるためにあなたのSWRevealViewControllerを設定していない可能性があります。 カスタムクラスストーリーボードID身分検査官SWRevealViewControllerと設定することを忘れないでください。あなたが最初にログインページを表示する必要がある場合には

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let rootVC = storyboard.instantiateViewController(withIdentifier: "SWRevealViewController")  
    self.view.window?.rootViewController = rootVC 

    // Cont. with your code... 
} 

、ユーザーがログインした後、ウィンドウがrootViewController

func changeRootVCToSWRevealVC() { 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let rootVC = storyboard.instantiateViewController(withIdentifier: "SWRevealViewController") 
    if let window = self.window{ 
     window.rootViewController = rootVC 
    } 
} 

を更新することができますAppDelegateで関数を、必要としますrooViewControllerSWRevealViewControllerに変更することができます。

if let appDelegate = UIApplication.shared.delegate as? AppDelegate { 
    appDelegate.changeRootVCToSWRevealVC() 
} 

あなたは最後のログインの状態を格納する変数を持っている、とLoginViewControllerではなく、ナビゲーションドロワーメニューに直接移動します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    let rootVCId = isLoggedin ? "SWRevealViewController" : "LoginViewController" 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let rootVC = storyboard.instantiateViewController(withIdentifier: rootVCId)  
    self.view.window?.rootViewController = rootVC 

    // Cont. with your code... 
} 
+0

申し訳ありませんが、これはダムに聞こえるが、私はこれをどこに置けばいいのか?私はそのアプリケーションの代理人だと仮定していますが、すでにユーザーログイン用の別のルートビューコントローラがあります。アプリがクラッシュするようにします。修正があるのですか、それとも間違った場所に置いていますか?私に手伝ってくれてありがとう! – williej926

+0

私は自分の答えを更新しました。最後のログイン状態を格納する変数があり、ユーザに再ログインさせるのではなくナビゲーション・ドロワー・メニューに直接ナビゲートしたい場合は、 'didFinishLaunchingWithOptions'を変更して、' rootViewController'が ' LoginViewController'または 'SWRevelViewController'を呼び出します。 – Lawliet

0

私はちょうどこの同じ問題を抱えていました。私の問題は、「おっと!私は何かを見逃して30分かけて頭を傷つけた。 :facepalm:

回答がうまくいかない場合は、メニュープロパティをコンセントでストーリーボードに接続していることを確認してください。

スウィフト:

@IBOutlet weak var menuButton:UIBarButtonItem! 

override func viewDidLoad() { 
    if (self.revealViewController() != nil) { 
     menuButton.target = self.revealViewController() 
     menuButton.action = #selector(SWRevealViewController.revealToggle(_:)) 
    } 
} 
関連する問題