GOOGLE ADS

Sonntag, 17. April 2022

Verwandle Button in Picker

Ich habe diesen Code, in dem es drei Schaltflächen gibt, in denen jeweils Werte gespeichert sind.

Wenn ich die AddTaste drücke, addieren sich die Werte und erscheinen in der Liste. Ich kann jedoch nicht überprüfen, welche Werte ausgewählt werden.

Wie kann ich die Schaltfläche wie einen Picker aussehen lassen, so dass, wenn der Benutzer auf die Schaltfläche A, B, oder klickt C, mit einem Häkchen angezeigt wird, dass sie ausgewählt wurde, und wenn der Benutzer auf die AddSchaltfläche tippt, der Wert der ausgewählten Schaltfläche und "gp"sollte auf der Liste erscheinen? Außerdem sollte das Häkchen verschwinden, sobald die AddSchaltfläche ausgewählt ist, damit der Benutzer eine andere Liste auswählen kann.

Wie zum Beispiel:


  • Wenn A und B ausgewählt sind, sollte die Liste wie folgt aussehen:


A = 2,0, B = 5,0, gp = 7,0.


  • Wenn A und C ausgewählt sind, sollte die Liste wie folgt aussehen:


A = 2,0, C = 7,0, gp = 9,0.

Ich habe es mit Pickerund anderen Methoden versucht, bin aber nicht durchgekommen. Ich habe dies als die beste Lösung gefunden. Ich kann jedoch kein Häkchen auf die Schaltflächen setzen und die ausgewählten Werte nicht in der Liste anzeigen.

import SwiftUI
struct MainView: View {
@State var br = Double()
@State var loadpay = Double()
@State var gp: Double = 0
@State var count: Int = 1
@State var listcheck = Bool()
@StateObject var taskStore = TaskStore()
@State var a = 2.0
@State var b = 5.0
@State var c = 7.0

//var userCasual = UserDefaults.standard.value(forKey: "userCasual") as? String?? ""
@State var name = String()

func addNewToDo() {
taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: "load \(gp)", amount: Double(gp)))
self.gp = 0.0
}
func stepcount() {
count += 1
}
var body: some View {
HStack {
Button(action: { gp += a }) {
Text("A =").frame(width: 70, height: 15)
.foregroundColor(.yellow)
}
.background(RoundedRectangle(cornerRadius: 5))
.foregroundColor(.black)
Button(action: { gp += b }) {
Text("B =").frame(width: 70, height: 15)
.foregroundColor(.yellow)
}
.background(RoundedRectangle(cornerRadius: 5))
.foregroundColor(.black)
Button(action: { gp += c }) {
Text("C =").frame(width: 70, height: 15)
.foregroundColor(.yellow)
}
.background(RoundedRectangle(cornerRadius: 5))
.foregroundColor(.black)
}
HStack(spacing: 15) {
Button(
String(format: ""),
action: {
print("pay for the shift is ")
gp += loadpay
}
)
Button(
action: {
addNewToDo()
stepcount()
},
label: { Text("Add")}
)
}
Form {
ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
}
}
}
struct Task: Codable, Identifiable {
var id = ""
var toDoItem = ""
var amount = 0.0
}
class TaskStore: ObservableObject {
@Published var tasks = [Task]()
}


Lösung des Problems

Das Problem ist, dass Sie versuchen, a Buttonin etwas zu verwandeln, das es nicht ist. Sie können Ihre eigene Ansicht erstellen, die auf ein Antippen reagiert und ihren Status beibehält, damit sie weiß, ob sie derzeit ausgewählt ist oder nicht. Ein Beispiel ist dieses:

struct MultiPickerView: View {

@State private var selectA = false
@State private var selectB = false
@State private var selectC = false

let A = 2.0
let B = 5.0
let C = 7.0

var gp: Double {
(selectA? A: 0) + (selectB? B: 0) + (selectC? C: 0)
}

var body: some View {
VStack {
HStack {
SelectionButton(title: "A", selection: $selectA)
SelectionButton(title: "B", selection: $selectB)
SelectionButton(title: "C", selection: $selectC)
}
.foregroundColor(.blue)
Text(gp.description)
.padding()
}
}
}
struct SelectionButton: View {
let title: String
@Binding var selection: Bool

var body: some View {
HStack {
Image(systemName: selection? "checkmark.circle": "circle")
Text(title)
}
.padding()
.overlay(
RoundedRectangle(cornerRadius: 15)
.stroke(Color.blue, lineWidth: 4)
)
.padding()
.onTapGesture {
selection.toggle()
}
}
}

Sie könnten es anpassungsfähiger machen, indem Sie ein verwenden Array, das eine Struktur hat, die den Wert und den ausgewählten Zustand beibehält, und es durch ein ausführen ForEach, aber das sind die Grundlagen der Logik.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...