代码参考: iOS — Persist Data using SQLite.swift Library with SwiftUI example | by Amisha I | Canopas
具体代码如何实现这里不在啰嗦,原作者原文写的非常详细。 这里只一下哪些可以学习的“套路”。
viewModel统一管理数据订阅
例如BikingListViewModel
- 在List页面出现的时候调用
getTaskList
更新数据 - 删除的时候更新数据源
swift
import Foundation
import SwiftUI
class BikingListViewModel: ObservableObject {
@Published var allTask: [Task] = []
func getTaskList() {
allTask = BikingDataStore.shared.getAllTasks()
}
// 删除:删除完成刷新页面
func deleteTask(at indexSet: IndexSet) {
let id = indexSet.map { self.allTask[$0].id }.first
if let id = id {
let delete = BikingDataStore.shared.delete(id: id)
if delete {
getTaskList()
}
}
}
}
import Foundation
import SwiftUI
class BikingListViewModel: ObservableObject {
@Published var allTask: [Task] = []
func getTaskList() {
allTask = BikingDataStore.shared.getAllTasks()
}
// 删除:删除完成刷新页面
func deleteTask(at indexSet: IndexSet) {
let id = indexSet.map { self.allTask[$0].id }.first
if let id = id {
let delete = BikingDataStore.shared.delete(id: id)
if delete {
getTaskList()
}
}
}
}
Tips
任意图形设置成圆角
使用.cornerRadius(.infinity)
swift
struct BikingStartButton: View {
var body: some View {
Image(systemName: "bicycle")
.resizable()
.scaledToFill()
.frame(width: 25, height: 25)
.foregroundColor(.white)
.padding(20)
.background(Color.accentColor)
// 设置为圆角
// 这种设置在创建按钮、卡片、标签等圆形或圆角视图时很有用。通常情况下,我们可以设置一个固定的半径来产生具有一定角度的圆角效果,但是当我们想要完全没有角度时,就需要将半径设置为无限大,即 cornerRadius(.infinity)。这样的设置可以使一个矩形视图变为一个完全圆形的视图,或使视图的四个角完全变为圆形,没有任何锐角。
.cornerRadius(.infinity)
}
}
struct BikingStartButton: View {
var body: some View {
Image(systemName: "bicycle")
.resizable()
.scaledToFill()
.frame(width: 25, height: 25)
.foregroundColor(.white)
.padding(20)
.background(Color.accentColor)
// 设置为圆角
// 这种设置在创建按钮、卡片、标签等圆形或圆角视图时很有用。通常情况下,我们可以设置一个固定的半径来产生具有一定角度的圆角效果,但是当我们想要完全没有角度时,就需要将半径设置为无限大,即 cornerRadius(.infinity)。这样的设置可以使一个矩形视图变为一个完全圆形的视图,或使视图的四个角完全变为圆形,没有任何锐角。
.cornerRadius(.infinity)
}
}
页面pop
swift
import SwiftUI
struct BikingDetailView: View {
@ObservedObject var viewModel: BikingDetailViewModel
@Environment(\.presentationMode) var presentationMode
var status = ["Completed", "Incomplete"]
var body: some View {
VStack(spacing: 20) {
HStack(spacing: 20) {
Text("Name:")
TextField("Name", text: $viewModel.name)
.textFieldStyle(.roundedBorder)
}
HStack(spacing: 20) {
Text("Approx Date:")
DatePicker("", selection: $viewModel.approxDate)
Spacer()
}
HStack {
Text("Status:")
Picker("Choose Status?", selection: $viewModel.status) {
ForEach(status, id: \.self) {
Text($0)
}
}
.pickerStyle(.segmented)
Spacer()
}
HStack {
Button(action: {
let updateSuccess = viewModel.onUpdateClick()
if updateSuccess {
self.presentationMode.wrappedValue.dismiss()
}
}) {
Text("Update")
.foregroundColor(.white)
.font(.headline)
.padding(.vertical, 10)
.padding(.horizontal, 30)
}
.background(Color.accentColor)
.cornerRadius(.infinity)
.padding()
}
Spacer()
}
.padding(.horizontal)
}
}
import SwiftUI
struct BikingDetailView: View {
@ObservedObject var viewModel: BikingDetailViewModel
@Environment(\.presentationMode) var presentationMode
var status = ["Completed", "Incomplete"]
var body: some View {
VStack(spacing: 20) {
HStack(spacing: 20) {
Text("Name:")
TextField("Name", text: $viewModel.name)
.textFieldStyle(.roundedBorder)
}
HStack(spacing: 20) {
Text("Approx Date:")
DatePicker("", selection: $viewModel.approxDate)
Spacer()
}
HStack {
Text("Status:")
Picker("Choose Status?", selection: $viewModel.status) {
ForEach(status, id: \.self) {
Text($0)
}
}
.pickerStyle(.segmented)
Spacer()
}
HStack {
Button(action: {
let updateSuccess = viewModel.onUpdateClick()
if updateSuccess {
self.presentationMode.wrappedValue.dismiss()
}
}) {
Text("Update")
.foregroundColor(.white)
.font(.headline)
.padding(.vertical, 10)
.padding(.horizontal, 30)
}
.background(Color.accentColor)
.cornerRadius(.infinity)
.padding()
}
Spacer()
}
.padding(.horizontal)
}
}