Как передать один SwiftUI View как переменную в другую структуру View - PullRequest
0 голосов
/ 08 июля 2019

Я реализую очень пользовательский NavigationLink с именем MenuItem и хотел бы повторно использовать его в проекте.Это структура, которая соответствует View и реализует var body : some View, которая содержит NavigationLink.Мне нужно как-то сохранить представление, которое должно быть представлено NavigationLink в теле MenuItem, но пока не удалось этого сделать.

Я определил destinationView в теле MenuItem какsome View и попробовал два инициализатора:

Это казалось слишком простым:

struct MenuItem: View {
    private var destinationView: some View

    init(destinationView: View) {
        self.destinationView = destinationView
    }

    var body : some View {
        // Here I'm passing destinationView to NavigationLink...
    }
}

-> Ошибка: Протокол 'Просмотр' может использоваться только как универсальныйограничение, поскольку оно имеет требования к Self или связанному типу.

2-я попытка:

struct MenuItem: View {
    private var destinationView: some View

    init<V>(destinationView: V) where V: View {
        self.destinationView = destinationView
    }

    var body : some View {
        // Here I'm passing destinationView to NavigationLink...
    }
}

-> Ошибка: Невозможно назначить значение типа 'V' для типа 'some View '.

Финальная попытка:

struct MenuItem: View {
    private var destinationView: some View

    init<V>(destinationView: V) where V: View {
        self.destinationView = destinationView as View
    }

    var body : some View {
        // Here I'm passing destinationView to NavigationLink...
    }
}

-> Error: Невозможно присвоить значение типа' View 'для типа' some View '.

Надеюсь, кто-нибудь сможет мне помочь.Должен быть способ, если NavigationLink может принимать некоторые View в качестве аргумента.Спасибо; D

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Вы должны сделать общий параметр частью MenuItem:

struct MenuItem<Content: View>: View {
    private var destinationView: Content

    init(destinationView: Content) {
        self.destinationView = destinationView
    }

    var body : some View {
        // ...
    }
}
0 голосов
/ 10 июля 2019

То, как Apple делает это, использует построители функций, есть предопределенный, называемый ViewBuilder, создающий последний или единственный аргумент вашего метода init для MenuItem это

...., @ViewBuilder builder: @escaping () -> Content)

присваивает его свойству, определенному что-то вроде

  let                 viewBuilder: () -> Content

и затем, куда вы хотите вывести Виды, просто вызовите функцию, как

HStack {
    viewBuilder()
}

тогда можно сделать

MenuItem {
   Image("myImage")
   Text("My Text")
}

Это позволит вам пропустить до 10 видов просмотра и использования условий и т. Д., Поэтому, если вы хотите, чтобы это было более ограничительным, вам придется определить свой собственный построитель функций. Я не сделал этого, поэтому вам придется гуглить это.

...