SwiftUI极简教程27:DisclosureGroup拓展折叠视图的使用

简介: SwiftUI极简教程27:DisclosureGroup拓展折叠视图的使用

在本章中,你将学会使用DisclosureGroup拓展折叠视图构建一个FAQ页面。

在很多工具类的App中,我们常常可以看到一个“新手教程”页面,或者“常见问题”页面,在这个页面中,我们可以看到开发者留下的一些App常见问题及其解答。

它的交互模式也比较简单,点击问题,展示答案。

image.png

下面,我们来使用DisclosureGroup拓展折叠视图构建一个FAQ页面。

开始

首先,创建一个新项目,命名为SwiftUIDisclosureGroup

image.png

基础搭建


首先我们先了解下DisclosureGroup拓展折叠视图的使用方法:


DisclosureGroup(
    isExpanded: $isExpanded,
    content: {
        //答案代码块
    },
    label: {
        //问题代码块
        }
)


DisclosureGroup拓展折叠视图的使用需要定义3个参数。

一是绑定的点击事件$isExpanded,这是根据用户点击哪一个问题,对应展开哪一个问题的答案。


@State var isExpanded = false

然后是问题和答案,我们用Text文本构建问题和答案。

image.png

我们运行模拟器,尝试点击问题,我们发现它可以实现点击展开和收起了。

进阶

如果我们有多个问题和答案组成FAQ,那我们该怎么做呢?

很简单,我们可以尝试使用List列表和ForEach循环的方式遍历数据。

首先,我们创建数组数据,在数组中,我们编辑好了问题和答案。


private let FAQ = [
        (
            question: "如何把大象装进冰箱?",
            answer: "第一,先把冰箱打开。第二,把大象装进去。第三,把冰箱门关上。"
        ),
        (
            question: "如何把企鹅装进冰箱?",
            answer: "第一,先把冰箱打开。第二,把大象拿进去。第三,把企鹅装进去。第三,把冰箱门关上。"
        ),
        (
            question: "动物森林要举行动物大会,有一只动物缺席了,是什么动物?",
            answer: "企鹅,因为它在冰箱里面。"
        )
                    ]


然后我们使用List列表和ForEach循环遍历数据。

image.png

完善


预览模拟器效果,我们发现点击展开时,所有答案都展开了,这不是我们想要的效果。

因为我们isExpanded是否展开的状态只有是和否,所以才会都展开和收起。我们希望的效果是,点击哪一个问题,就展示对应的答案。

我们需要设置isExpanded根据数据确定状态。


@State var isExpanded = Array(repeating: false, count: 3)


然后修订DisclosureGroup拓展折叠视图isExpanded绑定为根据点击的项目的索引进行展开和收起。

这样我们就完成了使用DisclosureGroup拓展折叠视图构建一个FAQ页面。

image.png

完整代码

import SwiftUI
struct ContentView: View {
    @State var isExpanded = Array(repeating: false, count: 3)
    private let FAQ = [
            (
                question: "如何把大象装进冰箱?",
                answer: "第一,先把冰箱打开。第二,把大象装进去。第三,把冰箱门关上。"
            ),
            (
                question: "如何把企鹅装进冰箱?",
                answer: "第一,先把冰箱打开。第二,把大象拿进去。第三,把企鹅装进去。第三,把冰箱门关上。"
            ),
            (
                question: "动物森林要举行动物大会,有一只动物缺席了,是什么动物?",
                answer: "企鹅,因为它在冰箱里面。"
            )
                        ]
    var body: some View {
        List {
            ForEach(FAQ.indices, id: \.self) { index in
                DisclosureGroup(
                    isExpanded: $isExpanded[index],
                    content: {
                        // 答案代码块
                        Text(FAQ[index].answer)
                            .font(.body)
                            .fontWeight(.light)
                    },
                    label: {
                        // 问题代码块
                        Text(FAQ[index].question)
                            .font(.body)
                            .bold()
                    }
                ).padding()
            }
        }
    }
}

快来动手试试吧!



相关文章
|
8月前
展开&收起,使用SwiftUI搭建一个侧滑展开页面交互
展开&收起,使用SwiftUI搭建一个侧滑展开页面交互
118 0
|
API iOS开发
SwiftUI 中的自定义导航
默认情况下,SwiftUI提供的各种导航API在很大程度上是以用户直接输入为中心的——也就是说,导航是在系统响应例如按钮的点击和标签切换等事件时由系统本身处理的。
237 0
SwiftUI 中的自定义导航
|
测试技术 定位技术 C++
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
QCustomPlot开发笔记(二):QCustomPlot用户交互、元素项以及特殊用法
SwiftUI—借助sizeCategory预览不同字体下的文本视图
SwiftUI—借助sizeCategory预览不同字体下的文本视图
129 0
SwiftUI—借助sizeCategory预览不同字体下的文本视图
SwiftUI—预览视图在正常模式和黑暗模式下的效果
SwiftUI—预览视图在正常模式和黑暗模式下的效果
122 0
SwiftUI—预览视图在正常模式和黑暗模式下的效果
SwiftUI—如何在PreviewProvider中使用导航视图
SwiftUI—如何在PreviewProvider中使用导航视图
355 0
SwiftUI—如何在PreviewProvider中使用导航视图
SwiftUI—将子视图作为属性以使布局代码更简洁
SwiftUI—将子视图作为属性以使布局代码更简洁
155 0
SwiftUI—将子视图作为属性以使布局代码更简洁
|
前端开发
#私藏项目实操分享# 【练习案例React十】封装一个锚点tab栏
#私藏项目实操分享# 【练习案例React十】封装一个锚点tab栏
101 0
#私藏项目实操分享# 【练习案例React十】封装一个锚点tab栏
|
图形学
Unity 基础 之 自定义编辑器布局
Unity 是一个强大的开发引擎,一起来认识一下编辑器布局吧。看看如何才能调整出你想要的布局吧,调整后果然舒适哦~
411 0