提问人:J. Edgell 提问时间:6/16/2019 更新时间:6/7/2020 访问量:2875
如何在没有导航回溯的情况下启动 SwiftUI 视图?
How can I launch a SwiftUI View without Navigation back tracking?
问:
我想将 View 作为没有导航层次结构的独立视图启动。我不想使用 NavigationButton 的原因是我不想让用户返回到调用窗体。
我尝试了以下方法,类似于在 ScenceDelegate 中启动第一个视图的方式,但没有任何反应:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let window = appDelegate.getNewWindow()
window.rootViewController = UIHostingController(rootView: NewView())
window.makeKeyAndVisible()
我有正当理由不使用导航 UI,为了保持简短,我省略了解释。我避免使用故事板,以使其尽可能简单。
感谢您的任何解决方案建议。
答:
0赞
J. Edgell
6/16/2019
#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)
}
评论
0赞
Andy Thomas
8/20/2019
我已经在 SwiftUI Beta 5 中尝试过。它编译但没有任何反应,即没有新窗口。这种方法在 Beta 5 中仍然有效吗?我是否需要以某种方式将其挂接到 SceneDelegate 中?
0赞
JR.
9/18/2019
我正在使用 SwiftUI Beta 7 并遇到同样的问题。什么也没发生。有人知道如何处理这种情况吗?
0赞
ChrisH
1/28/2021
这实际上是利用了 SwiftUI 的过渡状态;应用委托和 RootViewController 最终将被完全删除。而且,据我所知,苹果并没有真正考虑在SwiftUI中进行全视图替换样式导航的方法(例如,替换根视图控制器)。这很糟糕!有条件地显示欢迎屏幕和登录屏幕或直接进入主屏幕不应该需要“单页应用程序”思维,正如上面 Fogmeister 所建议的那样(这是目前唯一的解决方法)。:(
评论
userLoggedIn