SwiftUI中的@EnvironmentObject-无法切换布尔值

时间:2020-02-21 10:24:13

标签: swift environment-variables global-variables swiftui

我有下面的课程来保持汉堡菜单的状态(无论是否显示)

class Menu: ObservableObject {
    @Published var isActive: Bool = false
}

我在Scene Delegate中将其实例化

let contentView = ContentView().environmentObject(Menu())

然后在一个简单的视图中,我试图切换isActive bool,但是在下面出现错误

struct Button: View {

    @EnvironmentObject var menuState: Menu

    var body: some View {

        VStack{

            Button(action: {
                self.menuState.isActive.toggle()
            }) {
                Text("A")
            }
        }

    }
}

这是我得到的错误:无法使用类型为'(action:@escaping()->(),@escaping()-> Text)'的参数列表来调用'Button'类型的初始化程序

2 个答案:

答案 0 :(得分:1)

问题是您将自定义View命名为Button,这也是现有SwiftUI按钮的名称。

只需将您的struct重命名为其他名称,您的代码就可以正常编译。

与您的问题无关,但是将单个View包裹在VStack中没有意义,您的body可以仅包含Button

struct MyButton: View {

    @EnvironmentObject var menuState: Menu

    var body: some View {
        Button(action: {
            self.menuState.isActive.toggle()
        }) {
            Text("A")
        }
    }
}

答案 1 :(得分:1)

您创建了一个名为Button的自定义视图,该视图与本机SwiftUI Button冲突(因为它们的名称相同)。

重命名您的Button视图,我认为这很好。