Совместное использование состояния от родителя между братьями и сестрами в SwiftUI - PullRequest
1 голос
/ 22 февраля 2020

Я хочу иметь ScrollView, в котором есть страницы с навигационными кнопками ниже, как показано здесь .

У меня есть следующие представления.

PageNav(titles: Array<String>, views: Array<AnyView>)
PageNavTop(views: Array<AnyView>)
PageNavBottom(titles: Array<String>)
PageNavButton(title: String, action: () -> Void)

И у меня есть следующая View иерархия, при условии, что у меня есть две страницы.

PageNav -> PageNavTop    -> AnyView<page view 1>
                         -> AnyView<page view 2>
        -> PageNavBottom -> PageNavButton(page title 1)
                         -> PageNavButton(page title 2)

Где PageNavTop имеет жесты, прикрепленные к представлению прокрутки, поэтому мы можем пролистывать страницы, а PageNavBottom позволяет нам используйте кнопки.

PageNav должен содержать @State var, который я буду использовать как @Binding var в дочернем представлении. Однако я использую пользовательскую функцию init и не могу понять, как передать состояние на два уровня кнопкам.

1 Ответ

0 голосов
/ 22 февраля 2020

Я понял это, я был почти там.

struct PageNav: View {
    @State var activeIndex = 0
    ...
        PageNavTop(views: self.views, activeIndex: self.$activeIndex)
        PageNavBottom(titles: self.titles, activeIndex: self.$activeIndex)
    ...

Обратите внимание на подчеркивание в self._activeIndex, вот где я ошибся с использованием $. Сначала я попытался использовать @Binding var activeIndex: Binding<Int>, но, конечно, тогда я не смог использовать это значение.

struct PageNavBottom: View {
    @Binding var activeIndex: Int
    ...
        PageNavButton(
            title: title,
            action: { self.activeIndex = index }
        )
    ...
    init(titles: [String], activeIndex: Binding<Int>) {
        self._activeIndex = activeIndex
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...