如何从父视图隐藏/显示子视图

克里斯·德诺波尔

我创建了一个显示内容和两个按钮(上一个和下一个)的自定义视图。请在下面找到该结构的代码:

struct PageNavigator<Content: View>: View {
var prevAction: () -> Void
var nextAction: () -> Void
private let content: () -> Content

init(prevAction: @escaping () -> Void, nextAction: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content) {
    self.prevAction = prevAction
    self.nextAction = nextAction
    self.content = content
}

var body: some View {
    VStack {
        content()

        HStack {
            Button(action: { self.prevAction() }) {
                HStack{
                    Image(systemName: "chevron.left.circle.fill")
                    Text("Prev")
                        .multilineTextAlignment(.leading)
                }
            }

            Spacer()


            Button(action: { self.nextAction() }) {
                HStack{
                    Text("Next")
                        .multilineTextAlignment(.trailing)
                    Image(systemName: "chevron.right.circle.fill")
                }
            }

        }
        .padding()
    }.padding()
}

这就是从父视图使用它的方式

        PageNavigator(prevAction: {
            if (self.pageToDisplay > 0){
                self.pageToDisplay = self.pageToDisplay - 1
            }else{
                self.pageToDisplay = 0
            }
        }, nextAction: {
            self.pageToDisplay = self.pageToDisplay + 1
        }){
            //content to display
            Spacer()
            if(self.pageToDisplay < self.messages.count){
                //show walkthrough
                MessageView(title: self.messages[self.pageToDisplay].title , content: self.messages[self.pageToDisplay].message)
            }else{
                if(self.pageToDisplay == self.messages.count){
                    TermsAgreementView(pageToDisplay: self.$pageToDisplay)
                }else if(self.pageToDisplay == self.messages.count + 1){
                    SetBaseCurrencyView()
                }else if(self.pageToDisplay == self.messages.count + 2){
                    SmartRemindersView()
                }else if(self.pageToDisplay == self.messages.count + 3){
                    GetStartedView()
                }
                else{
                    MessageView(title: "Test page \(self.messages.count)", content: "Test")
                }
            }
            Spacer()
        }

现在,我想要实现的是添加一个属性,该属性使我可以在父视图中显示或隐藏上一个或下一个按钮。什么是有效的方法?我尝试添加@Binding showNextButton:Bool和@Binding showPrevButton:Bool。但是它没有按预期工作。

提前致谢!

跟进/更新

因此,下面提出的解决方案有效,但是我有后续行动。因此,我创建了2个属性showNextBtn和showPrevBtn来显示/隐藏2个导航按钮。但是我想将它们设为可选,这样我就不必提供这两个参数。因此,如果未提供2个参数,则应隐藏2个按钮。我更新了如下代码:

struct PageNavigator<Content: View>: View {
var prevAction: () -> Void
var nextAction: () -> Void
private let content: () -> Content

@Binding var showNextBtn: Bool?
@Binding var showPrevBtn: Bool?

init(showNextBtn: Binding<Bool?>?, showPrevBtn: Binding<Bool?>?, prevAction: @escaping () -> Void, nextAction: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content) {
    self.prevAction = prevAction
    self.nextAction = nextAction
    self.content = content
    if showNextBtn != nil{
        self._showNextBtn = showNextBtn!
    }else{
        self._showNextBtn = Binding.constant(false)
    }

    if showPrevBtn != nil{
        self._showPrevBtn = showPrevBtn!
    }else{
        self._showPrevBtn = Binding.constant(false)
    }
}

var body: some View {
    VStack {
        content()

        HStack {
            if self.showPrevBtn!{
                Button(action: { self.prevAction() }) {
                    HStack{
                        Image(systemName: "chevron.left.circle.fill")
                        Text("Prev")
                            .multilineTextAlignment(.leading)
                    }
                }
            }

            Spacer()

            if self.showNextBtn!{
                Button(action: { self.nextAction() }) {
                    HStack{
                        Text("Next")
                            .multilineTextAlignment(.trailing)
                        Image(systemName: "chevron.right.circle.fill")
                    }
                }
            }

        }
        .padding()
    }.padding()
}

因此,我将上述视图用于父视图:

        PageNavigator(showNextBtn: $showNextBtn, showPrevBtn: $showPrevBtn, prevAction: {
            if (self.pageToDisplay > 0){
                self.pageToDisplay = self.pageToDisplay - 1
            }else{
                self.pageToDisplay = 0
            }
        }, nextAction: {
            self.pageToDisplay = self.pageToDisplay + 1...

但是我收到错误:对于$ showNextBtn和$ showPrevBtn参数,“无法将类型'Binding'的值转换为预期的参数类型'Binding?'”。我在这里想念什么吗?

谢谢!

野孩子

我实现了您要求使用@Binding的功能。这是我做的

struct PageNavigator<Content: View>: View {
var prevAction: () -> Void
var nextAction: () -> Void
private let content: () -> Content

@Binding var showNext : Bool

init(showNext : Binding<Bool> , prevAction: @escaping () -> Void, nextAction: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content) {
    self.prevAction = prevAction
    self.nextAction = nextAction
    self.content = content

    self._showNext = showNext
}

 var body: some View {
    VStack {
        ...

            if self.showNext {
                Button(action: { self.nextAction() }) {
                    HStack{
                        Text("Next")
                            .multilineTextAlignment(.trailing)
                        Image(systemName: "chevron.right.circle.fill")
                    }
                }
            }

        ...
    }
}

现在从父母那里:

@State var showNext : Bool = true
...
PageNavigator( showNext : self.$showNext, prevAction: {
        if (self.pageToDisplay > 0){
            --->
            self.showNext.toggle() // = false , true
        }else{
            self.pageToDisplay = 0
        }
    }, nextAction: {
        self.pageToDisplay = self.pageToDisplay + 1

    },content: {
        ...
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

延迟后如何从父视图隐藏子视图

如何使用Swift显示和/或隐藏子视图

如何从父视图快速访问容器视图子级

如何快速从父视图控制器访问子视图控制器?

如何将数据从父视图的演示者传递给子视图的演示者?

如何从父视图控制器中快速修改子视图控制器的对象

以编程方式显示和隐藏容器 UIView 及其子视图

更改按钮状态时显示/隐藏子视图

如何滚动滚动视图以在Android顶部显示子视图

如何在视图上添加多个子视图而不隐藏最后添加的子视图?

跳过layou子视图以获取隐藏视图

将触摸事件从父视图传递到特定的子视图

从父视图控制器调用子视图实例的功能

从父视图 SwiftUI 访问子视图中的 @State 变量

如何永远隐藏视图

HorizontalScrollView 隐藏其子视图

React Native 显示/隐藏视图

显示键盘时隐藏视图

显示/隐藏项目-列表视图

显示和隐藏列表视图

如何将数据从父视图控制器传递到子容器视图控制器

如何从父视图为元素添加间距?

如何隐藏/显示被ReactJS中的不同视图重用的组件的内容

如何在Webview滚动期间隐藏/显示底部导航视图

如何在单击按钮时显示和隐藏局部视图?

如何在滑动时显示和隐藏视图

如何使用 python 在 Maya 的活动视图中显示/隐藏项目(?)?

Flutter 如何在指定列表视图中显示/隐藏容器

如何快速显示和隐藏表格视图单元格