如何在 SwiftUI 中全屏显示视图?
How to present a view full-screen in SwiftUI?
我曾经登录view
,现在我想在登录后显示view
,但我不希望用户有可能return登录view
。在 UIkit
中我使用了 present()
,但在 SwiftUI
presentation(_ modal: Modal?)
中似乎 view
没有占据整个屏幕。 Navigation
也不是一个选项。
谢谢!
I do not want the user to have the possibility to return to the login view
在这种情况下,您不应离开登录视图,而应将其完全替换。
您可以通过有条件地构建登录视图或 "app view"。
像这样...
// create the full screen login view
struct LoginView: View {
// ...
}
//create the full screen app veiw
struct AppView: View {
// ...
}
// create the view that swaps between them
struct StartView: View {
@EnvironmentObject var isLoggedIn: Bool // you might not want to use this specifically.
var body: some View {
isLoggedIn ? AppView() : LoginView()
}
}
通过使用这样的模式,您不会显示或离开登录视图,而是完全替换它,因此它根本不再位于视图层次结构中。
这可确保用户无法导航回登录屏幕。
同样...通过使用这样的 @EnvironmentObject
,您可以稍后对其进行编辑(以注销),您的应用程序将自动返回到登录屏幕。
将正文封装在一个组中以消除编译器错误:
struct StartView: View {
@EnvironmentObject var userAuth: UserAuth
var body: some View {
Group {
if userAuth.isLoggedin {
AppView()
} else {
LoginView()
}
}
}
struct ContentView: View {
@EnvironmentObject var userAuth: UserAuth
var body: some View {
if !userAuth.isLoggedin {
return AnyView(LoginView())
} else {
return AnyView(HomeView())
}
}
}
我为自己做了这个扩展。欢迎任何feedback/ideas。 :)
https://github.com/klemenkosir/SwiftUI-FullModal
用法
struct ContentView: View {
@State var isPresented: Bool = false
var body: some View {
NavigationView {
Button(action: {
self.isPresented.toggle()
}) {
Text("Present")
}
.navigationBarTitle("Some title")
}
.present($isPresented, view: ModalView(isPresented: $isPresented))
}
}
struct ModalView: View {
@Binding var isPresented: Bool
var body: some View {
Button(action: {
self.isPresented.toggle()
}) {
Text("Dismiss")
}
}
}
我曾经登录view
,现在我想在登录后显示view
,但我不希望用户有可能return登录view
。在 UIkit
中我使用了 present()
,但在 SwiftUI
presentation(_ modal: Modal?)
中似乎 view
没有占据整个屏幕。 Navigation
也不是一个选项。
谢谢!
I do not want the user to have the possibility to return to the login view
在这种情况下,您不应离开登录视图,而应将其完全替换。
您可以通过有条件地构建登录视图或 "app view"。
像这样...
// create the full screen login view
struct LoginView: View {
// ...
}
//create the full screen app veiw
struct AppView: View {
// ...
}
// create the view that swaps between them
struct StartView: View {
@EnvironmentObject var isLoggedIn: Bool // you might not want to use this specifically.
var body: some View {
isLoggedIn ? AppView() : LoginView()
}
}
通过使用这样的模式,您不会显示或离开登录视图,而是完全替换它,因此它根本不再位于视图层次结构中。
这可确保用户无法导航回登录屏幕。
同样...通过使用这样的 @EnvironmentObject
,您可以稍后对其进行编辑(以注销),您的应用程序将自动返回到登录屏幕。
将正文封装在一个组中以消除编译器错误:
struct StartView: View {
@EnvironmentObject var userAuth: UserAuth
var body: some View {
Group {
if userAuth.isLoggedin {
AppView()
} else {
LoginView()
}
}
}
struct ContentView: View {
@EnvironmentObject var userAuth: UserAuth
var body: some View {
if !userAuth.isLoggedin {
return AnyView(LoginView())
} else {
return AnyView(HomeView())
}
}
}
我为自己做了这个扩展。欢迎任何feedback/ideas。 :)
https://github.com/klemenkosir/SwiftUI-FullModal
用法
struct ContentView: View {
@State var isPresented: Bool = false
var body: some View {
NavigationView {
Button(action: {
self.isPresented.toggle()
}) {
Text("Present")
}
.navigationBarTitle("Some title")
}
.present($isPresented, view: ModalView(isPresented: $isPresented))
}
}
struct ModalView: View {
@Binding var isPresented: Bool
var body: some View {
Button(action: {
self.isPresented.toggle()
}) {
Text("Dismiss")
}
}
}