为了获取登录、注册、退出的状态,需要使用Swift中的@escaping来创建一种回调函数,使用方法如下,以注册功能为例:

func register(username: String, password: String, completion: @escaping (Bool) -> Void) {
        // 注册
        Task {
            do {
                let session = try await client.auth.signUp(email: username, password: password)
                isAuthenticated = true
                errorMessage = nil
                completion(true)
            } catch {
                errorMessage = "Registration failed: \(error.localizedDescription)"
                print(errorMessage ?? "failed")
                completion(false)
            }
        }
    }

记录一下关于@escaping(逃逸闭包)在这种情况下的用法:

completion: @escaping (Bool) -> Void

@escaping后面的括号填写的是,需要回传的参数的类型。然后在函数中使用completion()来传参数,在上面的例子中就是如果登录没有异常的情况下就会返回true,有异常的情况下就会返回false,这样使用也得益于Supabase对于认证相关功能的封装,如果出现异常就会抛出,那么就可以使用catch来进行处理。如果是自定义的函数也可以仿照类似的方式进行处理。

那么回到View中应该如何使用闭包来处理结果的接收呢:

Button(action: {
    isLoading = true
    viewModel.login { res in // res 则为comletion传过来的参数,这里可以用任意名称来命名,符合变量命名规则即可
        isLoading = false
        if res {
            // 登录成功的处理
        } else {
            // 登录失败的处理
        }
    }
})

登录成功以后,我们需要进入到App的主页等页面以使用更多功能,所以我计划先建立一个TabView用来管理多个模块的页面,这个页面没有固定的模版或仰样式,只是提供一个思路,可以在此基础上进行扩展:

import SwiftUI

struct MainTabView: View {
    @ObservedObject var userAuthViewModel: UserAuthViewModel

    var body: some View {
        TabView {
            // .tabItem用于设置每个页面在Tabbar上显示的内容
            // Label用于创建文字和图标组合的组件,systemImage后面跟的字符串就是SF symbol中的图标标识
            HomeView()
                .tabItem {
                    Label("Home", systemImage: "house")
                }

            ProfileView(viewModel: userAuthViewModel)
                .tabItem {
                    Label("Profile", systemImage: "person.circle")
                }

            SettingsView()
                .tabItem {
                    Label("Settings", systemImage: "gear")
                }
            // HomeView、SettingsView按照SwiftUI初始化文件先建立就好,后续会再有调整
        }
    }
}

在上面的例子中使用到了SF Symbol,是苹果Apple 提供的一套可缩放的符号图标,专为 iOS、iPadOS、watchOS 和 macOS 设计。这些符号可以在应用中使用,并且支持动态调整大小和样式。可以完美适配苹果的各种系统。

目前拥有了TabView、WelcomeView,那么我们就需要根据用户的登录状态来进行判断处理了,登录成功后就需要进入到应用的功能页了,下面修改一下App的入口代码(LinkApp.swift):

import SwiftUI

@main
struct LinkApp: App {
    @StateObject var userAuthViewModel = UserAuthViewModel()

    var body: some Scene {
        WindowGroup {
            if userAuthViewModel.isAuthenticated {
                MainTabView(userAuthViewModel: userAuthViewModel)
            } else {
                WelcomeView(userAuthViewModel: userAuthViewModel)
            }
        }
    }
}


 

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐