Swift独立开发者--Link App的开发笔记(三)
escaping后面的括号填写的是,需要回传的参数的类型。然后在函数中使用completion()来传参数,在上面的例子中就是如果登录没有异常的情况下就会返回true,有异常的情况下就会返回false,这样使用也得益于Supabase对于认证相关功能的封装,如果出现异常就会抛出,那么就可以使用catch来进行处理。如果是自定义的函数也可以仿照类似的方式进行处理。,是苹果Apple 提供的一套可缩放
为了获取登录、注册、退出的状态,需要使用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)
}
}
}
}
更多推荐



所有评论(0)