100 Days of SwiftUI

100 Days of SwiftUI - Day 16 项目1

2020-10-15  本文已影响0人  星星星宇

我们将创建一个WeSplit项目

1.WeSplit:项目简介

创建
1.启动Xcode
2.创建新的Xcode项目
3.选择iOS和Single View App
4.选择SwiftUI构建用户界面

2.SwiftUI基本结构

新建项目的结构

工作从ContentView.swift进行,
var body: some View中some关键字增加了一个重要的限制:它必须始终返回view类型的视图

3.创建表格

SwiftUI提供了专用的视图类型,称为Form
添加10个以上的内容时,SwiftUI需要将其分组,使用Group

Form {
    Group {
        Text("Hello World")
        Text("Hello World")
        Text("Hello World")
        Text("Hello World")
        Text("Hello World")
        Text("Hello World")
    }

    Group {
        Text("Hello World")
        Text("Hello World")
        Text("Hello World")
        Text("Hello World")
        Text("Hello World")
    }
}

如果希望表单拆分为大块时,可以使用Section分为多个独立组。

Form {
    Section {
        Text("Hello World")
    }

    Section {
        Text("Hello World")
        Text("Hello World")
    }
}

4.添加导航栏

var body: some View {
    NavigationView {
        Form {
            Section {
                Text("Hello World")
            }
        }
        .navigationBarTitle(Text("SwiftUI"))
        .navigationBarTitleDisplayMode(.inline) //如果不想使用大标题,可以使用inline
    }
}

5.修改程序状态

“视图是它们状态的函数“。
用户界面由程序状态决定,例如,文本中输入姓名后才能点击继续。
这与之前的方案有很大不同,用户界面由一系列事件决定。事件意味着很难存储应用程序的状态。

struct ContentView: View {
    @State var tapCount = 0

    var body: some View {
        Button("Tap Count: \(tapCount)") {
            self.tapCount += 1
        }
    }
}

@State允许我们解决结构体的局限性。结构体无法更改属性值。但是@State由SwiftUI单独将其存储在可以修改的位置。
为什么不使用类保存状态?
使用类允许我们自由修改它们,但是随着学习,你会发现SwiftUI经常销毁并重新创建结构体,因此使用小而简单的结构体对性能至关重要。

@State专为存储在一个视图中的简单属性而设计。因此,Apple建议我们private向这些属性添加访问控制,例如:@State private var tapCount = 0。

6.状态绑定到View

双向绑定:我们绑定文本字段,以便它显示属性的值,但是我们也绑定它,以便对文本字段的任何更改也可以更新属性。

struct ContentView: View {
    @State private var name = ""

    var body: some View {
        Form {
            TextField("Enter your name", text: $name)
            Text("Hello World")
        }
    }
}

在属性前加入$,这将告诉Swift读取该属性的值,同时发生更改时将其写回。

7.循环创建视图

SwiftUI为循环遍历并创建视图提供了专用的视图类型ForEach

    var body: some View {
        Form {
            ForEach(0 ..< 12) {
                Text("num is \($0)")
            }
        }
    }

在Picker中使用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(students.indices) {
                    Text(self.students[$0])
                }
            }
            Text("You chose: Student # \(students[selectedStudent])")
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读