我做了两个ViewController,如何将根ViewController从ViewController()改为MainView()?下面是我在SceneDelegate中的代码
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.makeKeyAndVisible()
window?.backgroundColor = UIColor.black
if isNewUser == true {
window?.rootViewController = ViewController()
} else {
window?.rootViewController = MainView()
}
当我运行应用程序时,测试isNewUser = true和isNewUser = false时,这个工作正常。
在我的ViewController中
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Show the welcome screen, blah.
//Accept the location, blah.
//After accepted everything, change isNewUser to false in UserDefault.Standard
print("App is restart")
}
}
class MainView: UITabBarController, UITabBarControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
print("Welcome to AiOO!")
}
}
两者都能正常工作,但比如说,当我完成接受协议或接受位置时,第一次运行应用程序时......会在UserDefault.standard中将isNewUser设置为false。所以只有一件事我被卡住了,我怎么才能重启应用或者将rootViewController切换到MainView()?
UPDATED:RestartApp,当我点击 "Complete "按钮时,没有UITabBarControl,也不会调用MainView,直到我杀死应用程序并再次打开,它才会工作:( 以下是我的完整代码。
在SceneDelegate:
var versioncheck = "1.0.0.0"
class SceneDelegate: UIResponder, UIWindowSceneDelegate, RestartApp {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
sceneRestore()
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.makeKeyAndVisible()
window?.backgroundColor = UIColor(named: "Main Background")
restartApp()
}
func restartApp() {
if !UserDefaults.standard.bool(forKey: "New User") {UserDefaults.standard.set(true, forKey: "New User")}
let isNewUser = UserDefaults.standard.bool(forKey: "New User")
print(isNewUser) // It will keep say "true" even change to false in UserDefault
if isNewUser == true {
window?.rootViewController = ViewController()
} else if versioncheck != "1.0.0.0" {
window?.rootViewController = NewUpdate()
} else {
window?.rootViewController = MainView()
}
}
}
ViewController
protocol RestartApp {
func restartApp()
}
class ViewController: UIViewController {
var delegate: RestartApp?
override func viewDidLoad() {
super.viewDidLoad()
welcomePage()
}
}
当我点击 "完成 "按钮时,它会调用。
@objc func welcomeChangeGoToMain () {
UserDefaults.standard.set(false, forKey: "New User")
print(UserDefaults.standard.bool(forKey: "New User")) //It said "false"
welcomeTitle.removeFromSuperview()
welcomeSubline.removeFromSuperview()
welcomeNext.removeFromSuperview()
welcomeRequest.removeFromSuperview()
self.delegate?.restartApp()
}
你可以创建一个委托协议,每当isNewUser值被改变时被调用,并在场景类内调用它的委托函数,以呈现基于该值的视图控制器。像下面这样。
在你的SceneDelegate类里面。
// don't forget to assign the RestartApp Delegate here
class SceneDelegate: UIResponder, UIWindowSceneDelegate, RestartApp {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.makeKeyAndVisible()
restartApp()
}
并在sceneDelegate中创建restartApp函数。
func restartApp() {
let isNewUser = UserDefaults.standard.bool(forKey: "Key")
if isNewUser == true {
window?.rootViewController = ViewController()
} else {
window?.rootViewController = ViewController2()
}
}
在你想要重启函数被调用的最后,创建协议和它的委托调用,如下面。
protocol RestartApp {
func restartApp()
}
class ViewController2: UIViewController {
var delegate: RestartApp?
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults.standard.set(true, forKey: "Key")
view.backgroundColor = .yellow
print("VC2")
self.delegate?.restartApp() // this should be called wherever you want to restart the app ( inside an action or a function depends on your need )
}
}
总而言之,这里发生了什么,应用程序启动时,它在SceneDelegate类中调用willConnectTo函数,这个函数调用重启应用程序,并根据保存在IsNewUser中的最后一个值调用VC,然后在你的VC中,每次你调用self.delegate.restartApp(),它在SceneDelegate中调用重启函数,并根据你的isNewUser值调用VC。