如何使用一个删除按钮删除不同的变量



在本例中,我可以使用delete按钮从总金额中删除该金额。但是,我无法从总负载中删除负载。例如,在为load输入少量数据后,总负载总和和单个总负载量显示在load1和load2中。但是,在删除一个任务时,仅从总金额中减去该金额。如何从个人总负荷中减去被删除的负荷??

import SwiftUI
struct Task: Identifiable {
var id: UUID
var toDoItem: String
var amount: Float
init(toDoItem: String, amount: Float) {
self.id = UUID()
self.toDoItem = toDoItem
self.amount = amount
}
}
class TaskStore : ObservableObject {
@Published var tasks = [Task]()
}

struct Calculation: View {

@State var load1 = Float()
@State var load2 = Float()
@State var gp : Float = 0
@State var loadA : Float = 0
@State var loadB : Float = 0
@State var rate: Float = 0
@ObservedObject var taskStore = TaskStore()
@State private var birthDate = Date()
@State private var time1 = Date()
@State private var time2 = Date()
func addNewToDo() {

taskStore.tasks.append(
Task(
toDoItem:  "total = (rate.description) ",
amount: rate
)
)

}


var body: some View {
NavigationView {
VStack {
HStack {
VStack(spacing: 1) {

VStack(spacing: 1) {

List {

Section(header:Text("load 2"))
{
TextField("Enter value of load 1", value: $load1, format: .number)
TextField("Enter value of load 1", value: $load2, format: .number)
}

HStack {
Button(String(format: "Add Load"), action: {

print(Rocky(mypay: rate))
loadA += load1
loadB += load2
gp += rate
})

Button(action: {
addNewToDo()
Rocky(mypay: rate)
},
label: {
Text(" ")
})
}

ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
.onMove(perform : self.move)
.onDelete(perform : self.delete) //For each

}
.navigationBarTitle("Loads")
.navigationBarItems(trailing: EditButton()) //List
Text("Total Load1 = (loadA)")
Text("Total Load2 = (loadB)")
Text("Total = $(gp) ")

}.onAppear()

}
}
}
}
}
func Rocky(mypay: Float)
{
rate = load1 + load2
print("Sus (gp)")
}
func move(from source : IndexSet, to destination : Int)
{
taskStore.tasks.move(fromOffsets: source, toOffset: destination)
}
func delete(at offsets : IndexSet) {
if let index = offsets.first { 
let task = taskStore.tasks[index]
gp -= task.amount
}
taskStore.tasks.remove(atOffsets: offsets)
}
}

您需要创建2个变量来存储load1和load2在Task结构体中的数据,所以当delete()函数执行时,它知道要删除哪些数据。我已经添加了几行代码到您的原始代码与标签//add。我已经为你测试过了。

import SwiftUI
struct Task: Identifiable {
var id: UUID
var toDoItem: String
var amount: Float
var load1: Float //add
var load2: Float //add
init(toDoItem: String, amount: Float, load1: Float, load2: Float) {
self.id = UUID()
self.toDoItem = toDoItem
self.amount = amount
self.load1 = load1 //add
self.load2 = load2 //add
}
}
class TaskStore : ObservableObject {
@Published var tasks = [Task]()
}

struct Calculation: View {
@State var load1 = Float()
@State var load2 = Float()
@State var gp : Float = 0
@State var loadA : Float = 0
@State var loadB : Float = 0
@State var rate: Float = 0
@ObservedObject var taskStore = TaskStore()
@State private var birthDate = Date()
@State private var time1 = Date()
@State private var time2 = Date()
func addNewToDo() {

taskStore.tasks.append(
Task(
toDoItem:  "total = (rate.description) ",
amount: rate,
load1: load1, //add
load2: load2 //add
)
)

}

var body: some View {
NavigationView {
VStack {
HStack {
VStack(spacing: 1) {

VStack(spacing: 1) {

List {

Section(header:Text("load 2"))
{
TextField("Enter value of load 1", value: $load1, format: .number)
TextField("Enter value of load 1", value: $load2, format: .number)
}

HStack {
Button(String(format: "Add Load"), action: {

print(Rocky(mypay: rate))
loadA += load1
loadB += load2
gp += rate
})

Button(action: {
addNewToDo()
Rocky(mypay: rate)
},
label: {
Text(" ")
})
}

ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
.onMove(perform : self.move)
.onDelete(perform : self.delete) //For each

}
.navigationBarTitle("Loads")
.navigationBarItems(trailing: EditButton()) //List
Text("Total Load1 = (loadA)")
Text("Total Load2 = (loadB)")
Text("Total = $(gp) ")

}.onAppear()

}
}
}
}
}
func Rocky(mypay: Float)
{
rate = load1 + load2
print("Sus (gp)")
}
func move(from source : IndexSet, to destination : Int)
{
taskStore.tasks.move(fromOffsets: source, toOffset: destination)
}
func delete(at offsets : IndexSet) {
if let index = offsets.first {
let task = taskStore.tasks[index]
gp -= task.amount
loadA -= task.load1  //add
loadB -= task.load2  //add
}
taskStore.tasks.remove(atOffsets: offsets)
}
}

谢谢,成功了。但是,如果load1和load2是Double类型的环境变量,我们该怎么做呢?请检查以下代码。我在另一个类中定义了load1和load2。load1和load2可以作为userSettings调用。load1和userSettings.load2.

import SwiftUI
class UserSettings: ObservableObject{
@Published var load1: Double?
@Published var load2: Double?
}
struct Task: Identifiable {
@EnvironmentObject var userSettings: UserSettings
var id: UUID
var toDoItem: String
var amount: Float
var load1: Float //add
var load2: Float //add
init(toDoItem: String, amount: Float, load1: Float, load2: Float) {
self.id = UUID()
self.toDoItem = toDoItem
self.amount = amount
self.load1 = load1 //add
self.load2 = load2 //add
}
}
class TaskStore : ObservableObject {
@Published var tasks = [Task]()
}

struct Calculation: View {
@EnvironmentObject var userSettings: UserSettings
//@State var load1 = Float()
//@State var load2 = Float()
@State var gp : Float = 0
@State var loadA : Float = 0
@State var loadB : Float = 0
@State var rate: Float = 0
@ObservedObject var taskStore = TaskStore()
@State private var birthDate = Date()
@State private var time1 = Date()
@State private var time2 = Date()
func addNewToDo() {

taskStore.tasks.append(
Task(
toDoItem:  "total = (rate.description) ",
amount: rate,
load1: load1, //add
load2: load2 //add
)
)

}

var body: some View {
NavigationView {
VStack {
HStack {
VStack(spacing: 1) {

VStack(spacing: 1) {

List {

Section(header:Text("load 2"))
{
TextField("Enter value of load 1", value: $load1, format: .number)
TextField("Enter value of load 1", value: $load2, format: .number)
}

HStack {
Button(String(format: "Add Load"), action: {

print(Rocky(mypay: rate))
loadA += load1
loadB += load2
gp += rate
})

Button(action: {
addNewToDo()
Rocky(mypay: rate)
},
label: {
Text(" ")
})
}

ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
.onMove(perform : self.move)
.onDelete(perform : self.delete) //For each

}
.navigationBarTitle("Loads")
.navigationBarItems(trailing: EditButton()) //List
Text("Total Load1 = (loadA)")
Text("Total Load2 = (loadB)")
Text("Total = $(gp) ")

}.onAppear()

}
}
}
}
}
func Rocky(mypay: Float)
{
rate = load1 + load2
print("Sus (gp)")
}
func move(from source : IndexSet, to destination : Int)
{
taskStore.tasks.move(fromOffsets: source, toOffset: destination)
}
func delete(at offsets : IndexSet) {
if let index = offsets.first {
let task = taskStore.tasks[index]
gp -= task.amount
loadA -= task.load1  //add
loadB -= task.load2  //add
}
taskStore.tasks.remove(atOffsets: offsets)
}
}

最新更新