我是ios开发的新手,我刚接触过SwiftUI和Xcode12。我试图从一个登录屏幕上理解登录的流程,在你输入你的证书后,你会看到一个选项卡式屏幕。
当应用程序首次加载时,会显示登录信息,在登录成功后,将返回并保存来自服务器的令牌,并且进一步启动应用程序会检查令牌并显示相应的视图
WindowGroup {
if token == nil {
LoginView()
} else {
TabView()
}
}
我的问题是在应用程序中调用服务器,结果显示令牌无效,我想让用户返回登录屏幕,但已经设置了TabView。我也使用NavigationView,不希望登录屏幕上的后退按钮可用。
我找到的教程通常需要使用appDelegate和sceneDelegate,但我认为没有它们也是可能的
任何帮助我们都将不胜感激
发布于 2020-12-17 09:57:53
分层你的UI将会是最干净的。在你的app main中,我会创建不同的层,负责在下一层显示之前做一些事情。看一下下面的示例代码...
WindowGroup {
ZStack {
Color.background.edgesIgnoringSafeArea(.all)
// this layer will take care of sign up and authentication
AuthenticationLayer { account: AccountStore in
// city select will take care of a default location for the app
CitySelectLayer { city, citySelect in
// this layer will be responsible for displaying overlaid media
MediaLayer { mediaVM in
// main screen
TabbedScreen()
.environmentObject(account)
.environmentObject(city)
.environmentObject(citySelect)
.environmentObject(mediaVM)
}
}
}
}
}
我尝试了几种不同的方法,这是最干净的。图层视图看起来像这样……
struct MediaLayer<Content: View> : View {
// content
let content : (ImagesOverlayVM) -> Content
// view model
@StateObject var viewModel = ImagesOverlayVM()
var exitButton : some View {
Button(action: viewModel.dismissImages) {
Image(systemName: "xmark.circle")
.font(.system(.title3, design: .rounded))
.foregroundColor(.secondary)
}
}
var header : some View {
HStack {
exitButton
Spacer()
}.padding()
}
var loadingView : some View {
Image(systemImage: .radiowaves)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 32, height: 32)
.foregroundColor(.secondary)
.spin()
}
var placeholder : some View {
Image(systemName: "photo")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 32, height: 32)
.foregroundColor(.secondary)
}
func tabView(images: [S3ImageLoader]) -> some View {
TabView {
ForEach(images) { vm in
S3ImageView(viewModel: vm, contentMode: .fit) {
loadingView
} placeholder: {
placeholder
}
}
}.tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic))
}
var body : some View {
ZStack {
content(viewModel)
.isHidden(viewModel.images != nil)
if let images = viewModel.images {
VStack(spacing: 0) {
header
tabView(images: images)
header
.hidden()
}
}
}
}
}
https://stackoverflow.com/questions/65333372
复制相似问题