更改视图控制器并重新启动应用程序



我正在制作两个ViewControllers,如何将rootViewController从ViewController((更改为MainView((?这是我在场景委托中的代码

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时,这工作正常。

在我的视图控制器中

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((?

更新: 重新启动应用程序,当我单击"完成"按钮时没有运气,没有UITabBarControl,并且在我杀死应用程序并再次打开之前不会调用MainView,它:(以下是我的完整代码:

在场景委托中:

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()
}
}
}

视图控制器

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 值发生更改时都会调用该协议,并在场景类中调用它的委托函数,以便根据该值呈现视图控制器。像下面这样:

在你里面的场景委托类:

// 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 )
}
}

综上所述,这里会发生什么,应用程序启动它调用 将连接到场景委托类中的函数,这个调用重新启动应用程序并根据 IsNewUser 中保存的最后一个值调用 VC,然后在每次调用 self.delegate.restartApp(( 时,它会在 SceneDelegate 中调用重新启动函数并根据您的 isNewUser 值调用 VC

相关内容

最新更新