Day 23 - SwiftUI开发实作2 (多爱女朋友测试APP、Alert用法、传递变数)

今天一样是实作,不过今天实作就比较稍微不一样,我们会先讲alert的用法,并且讲解如何在不同View里传递变数。

Alert

有两种形式,显示或是不显示。

所以我们一样也要去设定变数

struct c3: View {
    @State private var showAlert = false
      var body: some View {
         Button(action: {
            showAlert = true
         }) {
            VStack {
               Text("酷吗")
            }
         }.alert(isPresented: $showAlert) { () -> Alert in
            let answer = ("n")
            return Alert(title: Text(answer))
         }
       }
    }

按下Button就可以触发Alert,Alert 会弹出对话框包含一个答案。

将ContentView的值传给SecondView

在这边有非常多的做法,我这边使用 @State and @Binding。

@State var c1 = ""
@Binding var c1:String

写法就是View1 用@State,View2 用@Binding 。

不过我们在NavigationLink中使用要使用以下做法:

NavigationLink(
                destination: t2(c1: $c1),
                label: {
                    Text("第二题")
                    
                })

正文

一样,我们先开启一个新的专案。

接着我们在ContentView设一个NavigationView。接着在里面包一个我们NavigationLink,并且指向目的地为t1。

接下来我们开一个新的swiftui。我们把它命名为t1。

接下来我们在t1结构里面写里面写文字、文字框,输入的数字我们设为c1。一样我们底下在写一个NavigationLink。

记得使用我们上面的做法传值。

接着我们直接在底下见一个新的结构t2,按照一样的做法建立第二个题目。用@Binding读到t1的c1变数。

接着我们建立一个Button叫出Alert为得分题可。

我们可以直接在Alert中做运算,不需外加func。

以下为完整程序范例:

struct t1: View {
    @State var sum = 0
    @State var c1 = ""
    var body: some View {
        VStack{
        Text("Q1:愿意每天打2个小时的电话 1~10分")
        TextField("请输入", text: $c1)
                        .padding()
                        .overlay(
                        RoundedRectangle(cornerRadius: 10)
                            .stroke(Color.pink, lineWidth: 5)
                        )
            NavigationLink(
                destination: t2(c1: $c1),
                label: {
                    Text("第二题")
                    
                })
        }.navigationTitle("第一题")
    }
}

struct t2: View{
    @Binding var c1:String
    @State var c2 = ""
    @State private var showAlert = false
    var body:some View {
        VStack{
        Text("Q2:愿意每周花一天陪女朋友出门逛街 1~10分")
        TextField("请输入", text: $c2)
                        .padding()
                        .overlay(
                        RoundedRectangle(cornerRadius: 10)
                            .stroke(Color.pink, lineWidth: 5)
                        )
            Button(action: {showAlert = true}) {
                            HStack {
                                Image(systemName: "person.fill.checkmark")
                                    .font(.title3)
                                Text("点我看得分吧!")
                                    .fontWeight(.semibold)
                                    .font(.title)
                            }
            }.alert(isPresented: $showAlert) { () -> Alert in
                let answer = (Int(c1) ?? 0) + (Int(c2) ?? 0)
                return Alert(title: Text(String(answer)))
             }
    }.navigationTitle("第二题")
        
}
}

总结

我个人觉得今天学得非常实用,好像很少中文教程把不同View取得变数这件事写的够详细,所以这边把它写出来给各位,并且今天加入了Alert给各位。


<<:  Day23 - 有了 CI/CD Pipeline ,还需要合适的 Git Workflow

>>:  Day23-资料操作

Day26练习java-抛出例外

昨天使用的是在有明确资讯时的例外处理,可以直接使用try catch抓出来,但有时在方法里需要传入资...

Dungeon Mizarka 025

今天难得有足够的时间可在Dungeon的专案进行调整,本来是想将时间花在整理行为的部份,但一直觉得目...

DAY15-EXCEL统计分析:Z检定介绍

Z检定: 什麽时候需要用到z检定呢? 当已经知道母体变异数时或是知道是一个大样本但不知道变异数为多少...

第十四天:初探 Build Scan

众所皆知 Gradle 是一个 Build Tool。对於编译式语言来说,编译过程会经过很多手续,这...

Make it easy to achieve CompTIA 220-1001 Exam Dumps certification

IT business is one of the most famous in the busin...