我是新手,我正在尝试实现以下功能:当用户登录时,每次重新打开应用程序时,他们将直接进入主页,而不是登录页面。
我参考了该教程:https : //www.youtube.com/watch?v=gjYAIXjpIS8&t=146s。并且我实现了像他一样执行的登录布尔检查,但是以某种方式遇到登录时重新打开主页的麻烦。我收到一条错误消息:[Presentation] Attempt to present <UITabBarController: 0x7fa68102ea00> on <IFTTT.ViewController: 0x7fa67fe0c150> (from <IFTTT.ViewController: 0x7fa67fe0c150>) whose view is not in the window hierarchy.
这是我的登录页面控制器类的方式:(这是打开应用程序时的入口点)我尝试以本教程的形式出现并进行表演,并且两者都在上面显示了相同的错误消息
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if isLoggedIn() {
performSegue(withIdentifier: "logInJump", sender: nil)
}
}
fileprivate func isLoggedIn() -> Bool {
print("logged in status: \(UserDefaults.standard.bool(forKey: "isLoggedIn"))")
return UserDefaults.standard.bool(forKey: "isLoggedIn")
}
@IBAction func signInButton(_ sender: Any) {
print("sign in tapped")
if let appURL = URL(string: "http://vocation.cs.umd.edu/flask/register") {
UIApplication.shared.open(appURL) { success in
if success {
print("The URL was delivered successfully.")
} else {
print("The URL failed to open.")
}
}
} else {
print("Invalid URL specified.")
}
}
}
// button broder width
@IBDesignable extension UIButton {
@IBInspectable var borderWidth: CGFloat {
set {
layer.borderWidth = newValue
}
get {
return layer.borderWidth
}
}
@IBInspectable var cornerRadius: CGFloat {
set {
layer.cornerRadius = newValue
}
get {
return layer.cornerRadius
}
}
@IBInspectable var borderColor: UIColor? {
set {
guard let uiColor = newValue else { return }
layer.borderColor = uiColor.cgColor
}
get {
guard let color = layer.borderColor else { return nil }
return UIColor(cgColor: color)
}
}
}
您需要对您的请求进行线程处理以执行segue。因为你的呼唤performSegue
在viewDidLoad()
什么情况是,加载之前的一切你的电话被调用,所以你需要引入一定的滞后性。
线程有时称为轻量级进程,因为它们具有自己的堆栈,但是可以访问共享数据。因为线程与进程以及进程中的其他线程共享相同的地址空间,所以线程之间通信的操作成本较低,这是一个优势
异步函数将等待promise的执行,而异步函数将始终返回promise。异步函数返回的promise将使用函数返回的任何值进行解析
长话短说,您需要等待所有内容都加载到内存中,并且如果您要从主堆栈/线程中调用函数,例如,viewDidLoad()
那么很有可能尚未将其加载到内存中。意思是说,logInJump
segue在那个视图控制器中那时不存在,因此是您的错误。
另一种可能性是您没有正确的视图/序列ID,但这应该引发了另一个错误。
另外,将发送者从更改nil
为self
。其实这是没有必要的,但我一直使用self
过nil
// change to desired number of seconds should be higher then 0
let when = DispatchTime.now() + 0.2
if isLoggedIn() {
DispatchQueue.main.asyncAfter(deadline: when) {
self.dismiss(animated: true, completion: nil)
self.performSegue(withIdentifier: "logInJump", sender: nil)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句