Невозможно присвоить значение типа «MenuView» типу «некоторое представление» - PullRequest
0 голосов
/ 21 октября 2019

Я заметил, что у вас может быть только один модификатор .popover в SwiftUI. Я должен представить два возможных простых поповера, один из которых MenuView, другой CreateChannelView.

. Для этого у меня есть:

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

, а затем модификатор:

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

Проблема в том, что я не вижу, как я могу назначить экземпляры MenuView или CreateChannelView на popover, когда я получаю ошибку:

Невозможноприсвойте значение типа 'MenuView' типу 'some View'

Это немного отличается от этого вопроса , который передает общие представления в методе init.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Решение было использовать AnyView:

@State private var popover: AnyView

Тогда его можно назначить как:

self.popover = AnyView(CreateChannelView(showing: self.$showPopover))
0 голосов
/ 22 октября 2019

Вы можете объявить два представления как две разные переменные, а затем переключать выбор между ними с помощью логического значения, определяющего, какие из них представлены. Я сделал пример программы с информацией, которую вы мне предоставили:

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(...)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...