Я новичок в программировании и SwiftUI, так что это будет основным. (этот код представляет собой комбинацию различных ObservableObject
руководств, которые я нашел, поэтому есть ненужные / неправильные шаги, на самом деле все может быть неправильным). Любая помощь приветствуется!
У меня есть основной список из четырех строк «переключателей», каждая из которых имеет свойство switchTask
. Подробное представление - это вкладка с несколькими экранами. Когда пользователь обновляет switchTask
в каких-либо подробных представлениях вкладок, мне нужно, чтобы это свойство задачи обновлялось в основном представлении списка для соответствующего SwitchRow
.
Мой ObservableObject - это массив switches
. Мне сложно понять, как правильно передать каждый экземпляр Switch в сведения о Tabview (PluggedInDetail
), чтобы обновить соответствующий switchTask
в основном списке. Должен ли я использовать вместо этого EnvironmentObject
?
ObservableObject и Row:
import SwiftUI
import Combine
class Switch: ObservableObject, Identifiable {
let id = UUID()
@Published var switchName: String
@Published var switchTask: String
init (switchName: String, switchTask: String) {
self.switchName = switchName
self.switchTask = switchTask
}
}
class Switches: ObservableObject {
//private init() { }
static let shared = Switches()
@Published var switches: [Switch]
init() {
//switchTask is to be updated on tabview detail
self.switches = [
Switch(switchName: "Switch Input 1", switchTask: ""),
Switch(switchName: "Switch Input 2", switchTask: ""),
Switch(switchName: "Switch Input 3", switchTask: ""),
Switch(switchName: "Switch Input 4", switchTask: "")]
}
}
struct SwitchRow: View {
@ObservedObject var myswitch: Switch
var body: some View {
HStack{
Image(systemName: "circle")
VStack{
Text(myswitch.switchName)
Text(myswitch.switchTask)
}
}
}
}
ContentView:
struct ContentView: View {
@ObservedObject var myswitches: Switches = .shared
var body: some View {
NavigationView{
VStack {
List(Array(myswitches.switches.enumerated()), id: \.element.id) { (i, Switch) in
NavigationLink(destination: tabDetail()){
SwitchRow(myswitch: self.myswitches.switches[i])
}
}
}
}
}
}
struct tabDetail: View {
@ObservedObject var detailSwitches: Switches = .shared
var body: some View {
TabView {
PluggedInDetail()
.tabItem {
Text("Plugged In")
}
TVDetail()
.tabItem {
Text("TV")
}
}
}
}
Подробное представление: (в настоящее время жестко запрограммирован элемент массива для обновления для Switch Input 1. Здесь мне нужна помощь)
import SwiftUI
import Combine
struct PluggedInDetail: View {
@ObservedObject var detailSwitches: Switches = .shared
var body: some View {
VStack {
// switchName should display in the text
Text(self.detailSwitches.switches[0].switchName)
Button(action: {
//This should update switchTask for whichever switch element is selected
self.detailSwitches.switches[0].switchTask = "Direct Press"
}) {
Text("Add Direct Press")
}
}
}
}