如何在没有导航回溯的情况下启动 SwiftUI 视图?
Posted
技术标签:
【中文标题】如何在没有导航回溯的情况下启动 SwiftUI 视图?【英文标题】:How can I launch a SwiftUI View without Navigation back tracking? 【发布时间】:2019-06-15 18:37:28 【问题描述】:我想将视图作为没有导航层次结构的独立视图启动。我不想使用 NavigationButton 的原因是我不希望用户返回调用表单。
我尝试了以下方法,类似于在 ScenceDelegate 中启动第一个视图的方式,但没有任何反应:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let window = appDelegate.getNewWindow()
window.rootViewController = UIHostingController(rootView: NewView())
window.makeKeyAndVisible()
我有正当理由不使用导航 UI,我将省略说明以保持简短。我避免使用情节提要,以使其尽可能简单。
感谢您提供任何解决方案建议。
【问题讨论】:
这是登录屏幕吗?或者类似的东西? 如果你只是不想去导航路线,因为你不希望用户能够返回,你可以禁用导航栏的返回按钮,甚至完全隐藏导航栏。 @Fogmeister 是的,它用于登录屏幕。我刚刚发现这在模拟器中有效,但在画布中无效,这很有意义!我将把这个问题留一会儿,看看是否有人有更好的方法。 在那种情况下......你不应该像这样过渡。您真的应该用新屏幕替换整个屏幕。使用像userLoggedIn
这样的 EnvironmentObject 并根据状态更新视图以显示登录屏幕或您的应用屏幕。
在这里看看我的回答...***.com/questions/56557979/…
【参考方案1】:
这就是我完成加载新根视图的方式。
我在 AppDelegate 代码中添加了以下内容
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
var window: UIWindow?
...
func loadNewRootSwiftUIView(rootViewController: UIViewController)
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = rootViewController
self.window = window
window.makeKeyAndVisible()
并在我的表单中放置以下内容:
struct LaunchView : View
var body: some View
VStack
Button(
action:
LaunchLoginView()
,
label:
Text("Login")
)
func LaunchLoginView()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let vContoller = UIHostingController(rootView: LoginView())
appDelegate.loadNewRootSwiftUIView(rootViewController: vContoller)
【讨论】:
我已经用 SwiftUI Beta 5 试过这个。它编译但没有任何反应,即没有新窗口。这种方法在 Beta 5 中仍然有效吗?我是否需要以某种方式将其挂接到 SceneDelegate 中? 我正在使用 SwiftUI Beta 7 并遇到同样的问题。没发生什么事。有人知道如何处理这种情况吗? 这真是利用了SwiftUI的过渡状态; App Delegates 和 RootViewControllers 最终将被完全删除。而且,据我所知,Apple 并没有真正考虑在 SwiftUI 中进行全视图替换样式导航(例如,替换根视图控制器)的方法。这很糟糕!有条件地显示欢迎屏幕和登录屏幕或直接进入主屏幕不应该需要“单页应用程序”思维,正如 Fogmeister 上面所建议的那样(这是目前唯一的解决方法)。 :(以上是关于如何在没有导航回溯的情况下启动 SwiftUI 视图?的主要内容,如果未能解决你的问题,请参考以下文章