前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SwiftU:在循环中创建视图

SwiftU:在循环中创建视图

作者头像
韦弦zhy
发布2020-03-20 12:23:57
2.1K0
发布2020-03-20 12:23:57
举报
\color{red}{\Large \mathbf{Hacking \quad with \quad iOS: SwiftUI \quad Edition}}
\color{red}{\Large \mathbf{Hacking \quad with \quad iOS: SwiftUI \quad Edition}}
{\Huge \mathbf{WeSplit}}
{\Huge \mathbf{WeSplit}}

通常在一个循环中创建多个SwiftUI视图。例如,我们可能想要遍历一系列名称,并让每个名称成为文本视图,或者遍历一系列菜单项,并将每个名称显示为图像。

SwiftUI为此提供了一个专用的视图类型,称为ForEach。这可以在数组和范围上循环,根据需要创建尽可能多的视图。更妙的是,ForEach不会像我们手动输入视图一样被10个视图限制所影响。

ForEach将为其循环的每个项运行一次闭包,并传入当前循环项。例如,如果我们从0循环到100,它将传入0、1、2,依此类推。

例如,这将创建一个包含100行的窗体:

Form {
    ForEach(0 ..< 100) { number in
        Text("Row \(number)")
    }
}

因为ForEach传入闭包,所以我们可以对参数名使用速记语法,如下所示:

Form {
    ForEach(0 ..< 100) {
        Text("Row \($0)")
    }
}

ForEach在使用SwiftUI的Picker视图时特别有用,它允许我们显示各种选项供用户选择。

为了证明这一点,我们将定义一个视图:

1、有一系列可能的学生名字。 2、具有一个@State属性存储当前选定学生。 3、创建一个Picker视图,要求用户选择他们最喜欢的,并将选择的值和@State属性双向绑定。 4、使用ForEach循环遍历所有可能的学生姓名,将其转换为文本视图。

这是相应的代码:

struct ContentView: View {
    let students = ["Harry", "Hermione", "Ron"]
    @State private var selectedStudent = 0

    var body: some View {
        VStack {
            Picker("Select your student", selection: $selectedStudent) {
                ForEach(0 ..< students.count) {
                    Text(self.students[$0])
                }
            }
            Text("You chose: Student # \(students[selectedStudent])")
        }
    }
}

虽然代码不多,但有几点值得说明:

1、students数组不需要用@State标记,因为它是一个常量,不会改变。 2、selectedStudent属性初始值为0,但可以更改,这就是为什么它标记为@State的原因。 3、Picker有一个标签,“Select your student”(选择你的学生),它告诉用户它做了什么,还提供了一些描述性的东西供屏幕阅读器朗读。 4、PickerselectedStudent有双向绑定,这意味着它将开始显示0的选择,但是在用户滑动选择器时更新属性。 5、在ForEach中,我们从0数到(但不包括)数组中的学生数。 6、我们为每个学生创建一个文本视图,显示该学生的姓名。

我们将在未来研究使用ForEach的其他方法,但这对于这个项目来说已经足够了。

这是这个项目概述的最后一部分,所以几乎是时候开始真正的代码了。如果要保存已编程的示例,则应将项目目录复制到其他位置。

准备好后,将ContentView.swift放回最初创建项目时的方式,这样我们就有了一个干净的工作基础:

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello World")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Creating views in a loop

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档