首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >纯SwiftUI登录,注册,注册流程,可能吗?

纯SwiftUI登录,注册,注册流程,可能吗?
EN

Stack Overflow用户
提问于 2020-12-17 09:15:34
回答 1查看 980关注 0票数 0

我是ios开发的新手,我刚接触过SwiftUI和Xcode12。我试图从一个登录屏幕上理解登录的流程,在你输入你的证书后,你会看到一个选项卡式屏幕。

当应用程序首次加载时,会显示登录信息,在登录成功后,将返回并保存来自服务器的令牌,并且进一步启动应用程序会检查令牌并显示相应的视图

代码语言:javascript
运行
复制
WindowGroup {
    if token == nil {
        LoginView()
    } else {
        TabView()
    }
}

我的问题是在应用程序中调用服务器,结果显示令牌无效,我想让用户返回登录屏幕,但已经设置了TabView。我也使用NavigationView,不希望登录屏幕上的后退按钮可用。

我找到的教程通常需要使用appDelegate和sceneDelegate,但我认为没有它们也是可能的

任何帮助我们都将不胜感激

EN

回答 1

Stack Overflow用户

发布于 2020-12-17 09:57:53

分层你的UI将会是最干净的。在你的app main中,我会创建不同的层,负责在下一层显示之前做一些事情。看一下下面的示例代码...

代码语言:javascript
运行
复制
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)
                    }
                }
            }
        }
    }

我尝试了几种不同的方法,这是最干净的。图层视图看起来像这样……

代码语言:javascript
运行
复制
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()
            }
        }
    }
}

}

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65333372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档