首页 > 解决方案 > 如何在另一个视图中更改类的布尔实例?

问题描述

我想在一个视图中点击一个按钮并更改另一个视图上的文本。更改布尔值的按钮位于 LessonOne 上,而我想在 ContentView 上显示的文本。

我的第一课中的代码是:

import SwiftUI
import Combine

class LessonTwoButton: ObservableObject {
    let didChange = PassthroughSubject <Void, Never >()
    var ButtonIsTapped = false {didSet {didChange.send()}}
}

struct LessonOne: View {
    
    @ObservedObject var ActivateNextLesson = LessonTwoButton ()
    
    var body: some View {
        
        VStack{
            Button (action: {
                self.ActivateNextLesson.ButtonIsTapped.toggle()
            }
            , label: {
                Text("Activate the next lesson")
            })
            
        }
        
    }
    
}

我的 ContentView 中的代码是:

import SwiftUI
import Combine

struct ContentView: View {
    
    @ObservedObject var lessontwobutton = LessonTwoButton()
    
    var body: some View {
        NavigationView{
            
            VStack{
                Text("Hello, world!")
                    .padding()
                
                if lessontwobutton.ButtonIsTapped{
                    Text ("The button has been pressed. Your lesson is unlocked")}
                else{
                    Text("This lesson is locked")
                }
                
                NavigationLink (
                    destination: LessonOne(),
                    label: {
                        Text("Next view")
                    })
                
            }
            
        }
        
    }
}

代码运行,但它没有绑定……我继续 LessonOne,点击按钮,返回 ContentView,但没有任何改变。你能告诉我该怎么做吗?

标签: swiftswiftuiobservedobject

解决方案


您需要LessonTwoButton在两个视图中使用相同的实例:

struct ContentView: View {
    @ObservedObject var lessontwobutton = LessonTwoButton() // create in parent only
    ...
struct LessonOne: View {
    @ObservedObject var ActivateNextLesson: LessonTwoButton // declare only
    ...
}
NavigationLink(
    destination: LessonOne(ActivateNextLesson: lessontwobutton), // pass here
    label: {
        Text("Next view")
    }
)

并且LessonTwoButton可以简化:

class LessonTwoButton: ObservableObject {
    @Published var ButtonIsTapped = false
}

推荐阅读