Ios 解析-绕过AppDelegate中的登录

Ios 解析-绕过AppDelegate中的登录,ios,swift,parse-platform,Ios,Swift,Parse Platform,我正在努力绕过登录屏幕,如果当前用户不是零。为此,我遵循了上面的建议。运行代码后,我在模拟器中得到一个空白的白色视图,没有显示任何错误。代码如下: storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()); let currentUser = PFUser.currentUser() print(currentUser) if currentUser != nil

我正在努力绕过登录屏幕,如果当前用户不是零。为此,我遵循了上面的建议。运行代码后,我在模拟器中得到一个空白的白色视图,没有显示任何错误。代码如下:

 storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle());
        let currentUser = PFUser.currentUser()
        print(currentUser)
        if currentUser != nil {
            self.window?.rootViewController = storyboard?.instantiateViewControllerWithIdentifier("HomeViewController");
        }
值得一提的是,HomeViewController基于选项卡导航。我错过了什么

我的设置是:

  • 应用程序启动,第一个视图是登录视图(带有注册按钮)。这个初始视图是SignenViewController,我在其中嵌入了一个UINavigationController
  • 用户可以通过提供凭据登录(如果正确,则执行segue以重定向到HomeViewController)
  • 用户可以注册并遵循步骤(多个控制器)。最后,它们将被重定向到主视图控制器

    • 您能提供更多信息吗

      这是我检查是否有人已经登录的方式

      override func viewDidAppear(animated: Bool) {
              let currentUser = PFUser.currentUser()
                      if currentUser != nil {
                        self.performSegueWithIdentifier("nameOfTheSegueIdentifier", sender: self)
      
                  }
      }
      

      我假设您的主页选项卡栏控制器具有标识符
      “HomeViewController”
      ,您的登录视图控制器具有标识符
      “SigningViewController”
      ,并且此代码位于您的
      didFinishLaunchingWithOptions()
      AppDelegate方法中:

      storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
      if let currentUser = PFUser.currentUser() { // currentUser is not nil
          // set up app for valid in user
          self.window?.rootViewController = storyboard?.instantiateViewControllerWithIdentifier("HomeViewController")
          return true // don't load the rootViewController from your storyboard (if you have an initial view set)
      } else { // there is no current user
          // set up app for new or non logged in user
          self.window?.rootViewController = storyboard?.instantiateViewControllerWithIdentifier("SignInViewController")
          return true
      }
      
      从您的评论中,听起来您有一个导航控制器,其根视图控制器是您的登录视图控制器,这就是为什么当您切换到选项卡栏控制器时,您会得到一个导航栏

      由于使用我的方法无法获得segue(以及登录视图控制器的导航栏),请初始化一个新的
      UINavigationController
      ,并将其
      rootViewController
      设置为您的选项卡栏控制器:

      if let currentUser = PFUser.currentUser() { // currentUser is not nil
          // load tab bar controller
          let tabBarController = storyboard?.instantiateViewControllerWithIdentifier("TabBarViewController")
      
          // initialize a new navigation controller with the tab bar controller as its rootViewController
          let navC = UINavigationController(rootViewController: tabBarController)
      
          // set the window's root view controller to be your new navigation controller
          self.window?.rootViewController = navC
      }
      

      通常
      PFUser.currentUser()
      不是零。您应该使用
      PFUser.currentUser().username
      。在您的登录/注册视图控制器中使用此代码(不是AppDelegate(它工作正常))

      在这段代码中需要注意两件事:它是在
      viewdide
      方法中执行的;不
      viewDidLoad
      。在视图出现之前,不能执行任何分段。另外,
      SEGUE
      是您的SEGUE名称的临时占位符。此序列应将用户转移到主页


      注意:给定的代码将显示
      登录/注册viewcontroller的
      场景约一秒钟。我建议在
      ViewController
      上放置一个与视图框架相同的
      UIImageView
      (覆盖整个屏幕)。如果用户名等于nil,则可以放置一条else语句,说明
      imageView.alpha=0
      (在viewDidLoad中将alpha设置为1)。希望这有帮助。

      看起来你应该把
      rootViewController=yourtabarviewcontroller
      放在哪里?因为如果用户未登录,他们将不会进入登录或注册视图。您使用的是自定义登录视图还是默认的解析视图?@TekShock custom我相信。我正在更新我的帖子,其中描述了我的设置。你在这里所做的是在一个特定的视图控制器中。处理检查用户是否登录的最佳实践是在AppDelegate类中。这将加载HomeControllerView,但由于选项卡控制器已就位,因此没有所有选项卡。知道怎么解决吗?@ksa_coder是故事板中的选项卡栏控制器?给它一个情节提要ID,并用上面选项卡栏控制器的ID替换HomeViewController。确定这样做了…但视图没有完全正确显示。选项卡栏显示正确,但顶部导航栏在所有选项卡上完全消失。我很高兴你能帮忙:)@ksa_编码器我想我明白你的意思。我已经更新了答案,将选项卡栏控制器包装在
      UINavigationController
      中。让我知道这是否有效。你好,JAL。虽然它在自动登录时确实如前所述工作,但我刚刚发现,当我第一次从SignInViewController登录时,导航栏不会显示!知道怎么解决吗?
      override func viewDidAppear(animated: Bool) {
          if PFUser.currentUser().username != nil {
              self.performSegueWithIdentifier("SEGUE", sender: self)
          }
      }