objective-c - 尝试呈现其 View 不在 View 层次结构中的 UITabBarController - Firebase、Swift

标签 objective-c swift uiviewcontroller uistoryboardsegue

我正在开发一个应用程序的登录系统,当用户注册时,我希望它能够直接“进入”该应用程序。意思是,返回登录屏幕,然后重定向“进入”应用程序,或提示在注册后登录。期望的结果是使用以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //The disallowed character set is the inverse of the allowed characters
    disallowedUsernameCharacters = allowedUsernameCharacters.invertedSet

    //Set the delegates
    confirmPassTextField.delegate = self
    passwordTextField.delegate = self
    usernameTextField.delegate = self
    emailTextField.delegate = self

    //Observe authentication events, if the authentication is successful, perform the segue
    ref.observeAuthEventWithBlock { (authData) -> Void in
        if authData != nil {

            //Use standard defaults
            let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
            //Store the uid
            prefs.setObject(authData.uid as String, forKey: "UID")

            self.performSegueWithIdentifier(self.successfulSignUp, sender: nil)
        }
    }
}

如果用户注册并通过身份验证,它将执行到 UITabBarController 的 Segue,其中包含应用程序本身的 5 个选项卡/ View 。这工作正常,但我收到警告:尝试呈现不在窗口层次结构中的 View !

通过一些研究,这似乎是人们收到的一个相当常见的警告。但是,我想修复它,以便应用程序的所有部分都能按预期运行。我发现有人建议把代码部分放在:

//Observe authentication events, if the authentication is successful, perform the segue
ref.observeAuthEventWithBlock { (authData) -> Void in
            if authData != nil {

                //Use standard defaults
                let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()
                //Store the uid
                prefs.setObject(authData.uid as String, forKey: "UID")

                self.performSegueWithIdentifier(self.successfulSignUp, sender: nil)
            }
}

viewWillAppear 方法内部,因为当前 View 在调用 segue 时可能不在层次结构中,但我不认为这是这里的解决方案,因为它没有被立即调用,仅在身份验证事件上 - 而且我不想将其放在这里,因为我的理解是此方法会根据事件频繁调用。

我还发现有些人在不同的线程上执行它,其内容如下:

dispatch_async(dispatch_get_main_queue(), {
            self.performSegueWithIdentifier(self.successfulSignUp, sender: nil)
})

但我的想法是,触发 segue 的“注册” View Controller 不是最顶层的 View Controller ,这就是发生错误的原因。另外,我读到解决方案是嵌入 UINavigationController,如果这是解决方案...有人知道如何执行此操作的任何资源吗?如果有不同的解决方案,会是什么?任何帮助都会很棒!干杯。

编辑:

我的 Storyboard如下所示: storyboard

入口点是 UITabBarController,在 AppDelegate.swift 中,我通过检查用户默认值中的 bool 值来检查用户是否已登录,如果他们未登录,我将 rootController 更改为LoginViewController,用户可以在其中登录,并且它将继续到 UITabBarController,或者他们可以注册,并且在成功注册后,它将继续到 UITabBarController - 正是在这里我收到警告

最佳答案

我还没弄清楚为什么,一旦我明白了,我就会更新答案,但为了解决这个问题,我添加了行 self.performSegueWithIdentifier(self.LoginToFeed, sender: nil)

进入一个单独的函数

func callSegue() {
    self.performSegueWithIdentifier(self.LoginToFeed, sender: nil)
}

并从 block 中调用该函数,警告不再出现

关于objective-c - 尝试呈现其 View 不在 View 层次结构中的 UITabBarController - Firebase、Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36535718/

相关文章:

objective-c - 如何立即停止 UIWebView 加载

iOS 应用滞后....图像可能是罪魁祸首吗?

swift - 仅当点击部分中的其他单元格时才取消选择单元格

ios - 如何在 Swift 中正确使用委托(delegate)?

objective-c - 在资源中保存 URL

Objective-c 符号 ** & +-

ios - Firebase 动态链接在应用启动时不起作用

Swift View 和 Controller 共享变量初始化麻烦

ios - UIBarButton 在空的 ViewControllers 中不可点击

ios - 接收方法内部如何快速释放内存?