![](/img/trans.png)
[英]Swift viewDidLoad() in second View Controller Scene not working
[英]Swift 3 / Xcode 8.2 - switch view in viewDidLoad not working
我想在用户登录时切换加载ViewController。问题:当用户等于“true”时,视图没有改变...
先感谢您!!
override func viewDidLoad() {
super.viewDidLoad()
var user: String?
user = UserDefaults.standard.value(forKey: "loginSuccessfull") as? String
if user == "true" {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView") as UIViewController!
self.show(vc!, sender: vc)
}
// Do any additional setup after loading the view, typically from a nib.
}
从viewDidLoad
方法中删除代码并使用以下方法。
override func viewDidAppear() {
guard let user = UserDefaults.standard.string(forKey: "loginSuccessfull"), user == "true" else {
return
}
let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView")!
self.present(vc, animated: true)
}
您应该在viewWillAppear()
或viewDidAppear()
显示您显示第二个View Controller的代码。
override func viewDidAppear() {
super.viewDidAppear()
var user: String?
user = UserDefaults.standard.value(forKey: "loginSuccessfull") as? String
if user == "true" {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView") as UIViewController!
self.show(vc!, sender: vc)
}
// Do any additional setup after loading the view, typically from a nib.
}
原因是在viewDidLoad()
期间,您的ViewController的某些属性尚未定义,并且尚未准备好呈现另一个ViewController。
你需要使它成为异步,不需要任何延迟,就像这样:
override func viewDidLoad() {
super.viewDidLoad()
var user: String?
user = UserDefaults.standard.value(forKey: "loginSuccessfull") as? String
DispatchQueue.main.asyncAfter(deadline: .now()) {
if user == "true" {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "SecondView") as UIViewController!
self.show(vc!, sender: vc)
}
}
}
而不是在viewDidLoad中编写逻辑,在呈现当前viewcontroller之前编写它
例如,如果要在应用程序启动时检查它,请检查用户是否已登录didFinishLaunching方法并相应地设置rootViewController。
如果想要从其他viewController中呈现它,首先检查用户登录状态并相应地显示viewcontroller,而不是检查viewDidLoad。
此外,您可以通过在一些延迟后执行操作来呈现视图控制器。
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
// present view contoller
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.