我正在开发一个应用程序的登录系统,当用户注册时,我希望它能够直接“进入”该应用程序。意思是,不返回登录屏幕,然后重定向“进入”应用程序,或提示在注册后登录。期望的结果是使用以下代码:
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,如果这是解决方案...有人知道如何执行此操作的任何资源吗?如果有不同的解决方案,会是什么?任何帮助都会很棒!干杯。
编辑:
入口点是 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/