【问题标题】:Self.revealViewController() returns nilSelf.revealViewController() 返回 nil
【发布时间】:2017-12-16 03:21:34
【问题描述】:

我目前正在尝试使用平移手势来显示控制器。截至目前,我的打开按钮有效,但是当我添加最后一行时,我的程序崩溃了,因为revealViewController 为nil。链接到 pod:https://github.com/John-Lluch/SWRevealViewController。

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

【问题讨论】:

    标签: swift swrevealviewcontroller


    【解决方案1】:

    我只是遇到了同样的问题并遇到了这篇文章。结果我的问题更像是“哎呀!”因为我错过了一些明显的东西,花了 30 分钟摸摸它。 :facepalm:

    如果接受的答案对您不起作用,请检查以确保您使用插座将菜单属性连接到情节提要。

    斯威夫特:

    @IBOutlet weak var menuButton:UIBarButtonItem!
    
    override func viewDidLoad() {
        if (self.revealViewController() != nil) {
            menuButton.target = self.revealViewController()
            menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可能没有将SWRevealViewController 设置为rootViewController。请记住在您的身份检查器中将Custom Class和Storyboard 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...
      }
      

      如果你需要在开始时显示一个登录页面,你需要一个函数AppDelegate,它允许窗口更新rootViewController

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

      用户登录后,您可以将rooViewController更改为SWRevealViewController。

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

      【讨论】:

      • 对不起,如果这听起来很愚蠢,但我应该把它放在哪里?我假设它是应用程序委托,但我已经有另一个用于用户登录的根视图控制器;从而让应用程序崩溃。有修复还是我把它放在错误的地方?感谢您抽出宝贵时间帮助我!
      • 我更新了我的答案。如果您有一个存储上次登录状态的变量,并且希望直接导航到导航抽屉菜单而不是强制用户重新登录,您可以修改didFinishLaunchingWithOptions 以检查rootViewController 是否应该是@ 987654335@ 或 SWRevelViewController.
      • @Lawliet 我已经尝试过你的代码,但它对我不起作用我也只使用 SWRevealViewController
      猜你喜欢
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 2019-06-20
      • 2014-09-27
      • 2017-06-11
      • 2014-12-29
      相关资源
      最近更新 更多