无法将“ MenuView”类型的值分配为“ some View”类型

时间:2019-10-21 20:18:03

标签: swift swiftui

我注意到您在SwiftUI中只能有一个.popover修饰符。我必须介绍两个可能的简单弹出窗口,其中一个是MenuView,另一个是CreateChannelView

为此,我有:

@State private var popover: some View
@State private var showPopover = false

然后是修饰符:

.popover(isPresented: self.$showPopover) {
    self.popover
}

问题是当出现错误时,我看不到如何将MenuViewCreateChannelView的实例分配给popover

  

无法将类型“ MenuView”的值分配为“某些视图”

这与this question有点不同,后者在init方法中传递通用视图。

2 个答案:

答案 0 :(得分:0)

您可以将两个视图声明为两个不同的变量,然后使用一个确定显示哪个布尔值的布尔值在两个视图之间切换选择。我用您提供的信息制作了一个示例程序:

struct ContentView: View {
    let buttonSize: CGFloat = 30
    @State var isPresented = false
    @State var usePopover1 = true
    var popover1: some View {
        Text("Popover 1")
    }
    var popover2: some View {
        Image(systemName: "star")
    }
    var body: some View {
        VStack {
            Button(action: {
                self.isPresented = true
            }) {
                Text("Present popover")
            }
            Button(action: {
                self.usePopover1.toggle()
            }) {
                Text("Switch from \(self.usePopover1 ? "popover1" : "popover2") to \(self.usePopover1 ? "popover2" : "popover1")")
            }
        }.popover(isPresented: $isPresented) {
            if self.usePopover1 {
                AnyView(self.popover1)
            } else {
                AnyView(self.popover2)
            }
        }
    }
}

我只是当场演示了两个弹出窗口,但是您可以声明自己是问题中提到的两种不同类型(let popover1: MenuView = MenuView(...)let popover2: CreateChannelView = CreateChannelView(...))。

答案 1 :(得分:0)

解决方案是使用AnyView

@State private var popover: AnyView

然后可以将其分配为:

self.popover = AnyView(CreateChannelView(showing: self.$showPopover))