在Xcode 12的SwiftUI项目中使用ViewRouter

问题描述

我尝试在新的Xcode 12项目中使用this方法(请参阅链接)作为创建SwiftUI应用程序登录页面方法,但是我遇到了一个问题,即不知道要添加什么到主菜单中应用程序结构。我还是一个初学者,尝试将ContentView().environmentObject(ViewRouter())添加到主应用程序结构的WindowGroup中。我是完全错误的还是Xcode为什么不建立视图?有人可以帮忙吗? 在工作代码段下方:

import SwiftUI
import Foundation
import Combine

class SceneDelegate: UIResponder,UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene,willConnectTo session: UIScenesession,options connectionoptions: UIScene.Connectionoptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: MotherView().environmentObject(ViewRouter()))
            self.window = window
            window.makeKeyAndVisible()
        }
    }
. . .
}

class ViewRouter: ObservableObject {
    let objectwillChange = PassthroughSubject<ViewRouter,Never>()
    var currentPage: String = "page1" {
        didSet {
            withAnimation() {
                objectwillChange.send(self)
            }
        }
    }
}

struct MotherView : View {
    @EnvironmentObject var viewRouter: ViewRouter
    var body: some View {
        vstack {
            if viewRouter.currentPage == "page1" {
                ContentViewA()
            } else if viewRouter.currentPage == "page2" {
                ContentViewB()
                    .transition(.scale)
            }
        }
    }
}

struct ContentViewA : View {
    @EnvironmentObject var viewRouter: ViewRouter
    var body: some View {
        Button(action: {self.viewRouter.currentPage = "page2"}) {
            Text("Login")
        }
    }
}

struct ContentViewB : View {
    
    @EnvironmentObject var viewRouter: ViewRouter
    
    var body: some View {
        Button(action: {self.viewRouter.currentPage = "page1"}) {
            Text("logout")
        }
    }
}

现在,我想用Xcode 12样式替换SceneDelegate,但是以下方法不起作用。知道为什么吗?

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            MotherView().environmentObject(ViewRouter())
        }
    }
}

解决方法

请尝试下一步:

  1. 删除整个SceneDelegate类(在您的情况下,不需要SceneDelegate类)

  2. 修改您的ViewRouter类,例如:

    ViewRouter类:ObservableObject { @Published var currentPage:字符串=“ page1” }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...