SwiftUI:在Detail TabView中更新ObservableObject数组以更新Main ListView



我是编程和SwiftUI的新手,所以这将是基本的。(这段代码是我发现的不同ObservableObject教程的组合,因此存在不必要/错误的步骤,事实上,整个过程可能是错误的(。非常感谢您的帮助!!

我有一个由四行"switch"组成的Main列表视图,每行都有一个switchTask属性。详细视图是一个带有几个屏幕的Tabview。当用户在任何详细选项卡视图中更新switchTask时,我需要在相应SwitchRow的主列表视图中更新该任务属性。

我的ObservableObject是一个数组switches。我很难弄清楚如何正确地将每个Switch实例传递到Tabview详细信息(PluggedInDetail(,以便更新主列表视图中相应的switchTask。我应该使用EnvironmentObject吗?

可观察对象和行:

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)
}
}
}
}

内容视图:

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")
}
}
}
}
struct SharedOO: View {
@ObservedObject var myswitches: Switches = .shared

var body: some View {
NavigationView{
VStack {
List(myswitches.switches, id: .id) { switche in
//You should only pass the individual item from here since the View is for a single Switch
NavigationLink(destination: SwitchDetail(switche: switche)){
SwitchRow(myswitch: switche)
}
}
}
}
}
}
struct SwitchDetail: View {
@ObservedObject var switche: Switch

var body: some View {
TabView {
PluggedInDetail().environmentObject(switche)
.tabItem {
Text("Plugged In")
}
/*//No Code Provided
TVDetail()
.tabItem {
Text("TV")
}
*/
}
}
}
struct PluggedInDetail: View {

@EnvironmentObject var switche: Switch

var body: some View {
VStack {
// switchName should display in the text
Text(self.switche.switchName)
Text(self.switche.switchTask)
Button(action: {
//This should update switchTask for whichever switch element is selected
self.switche.switchTask = "Direct Press"
}) {
Text("Add Direct Press")
}
}
}
}
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)
}
}
}
}

最新更新