在 SwiftUI 中的兄弟姐妹之间从父级共享状态

Posted

技术标签:

【中文标题】在 SwiftUI 中的兄弟姐妹之间从父级共享状态【英文标题】:Sharing state from parent between siblings in SwiftUI 【发布时间】:2020-06-06 14:56:45 【问题描述】:

我想要一个ScrollView,其中包含带有导航按钮的页面,如下所示here。

我有以下看法。

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】:

我想通了,我快到了。

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&lt;Int&gt;,但当然我不能使用该值。

struct PageNavBottom: View 
    @Binding var activeIndex: Int
    ...
        PageNavButton(
            title: title,
            action:  self.activeIndex = index 
        )
    ...
    init(titles: [String], activeIndex: Binding<Int>) 
        self._activeIndex = activeIndex

【讨论】:

以上是关于在 SwiftUI 中的兄弟姐妹之间从父级共享状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 4 中的兄弟组件之间共享功能

如何使用JQuery在输入中选择其孩子在最后一个不为空的父级的上一个兄弟姐妹

Python-XML:每个父级分隔兄弟姐妹

在 android 设备上渲染 webview 与来自同一个父级的先前兄弟级重叠

如何显示目标的祖父母的兄弟姐妹?

如何在 Angular 6 中从父级 HTML 编辑共享组件