美文网首页Swift
SwiftUI教程二:搭建一个数字选择游戏

SwiftUI教程二:搭建一个数字选择游戏

作者: 狂奔的胖蜗牛 | 来源:发表于2020-07-09 10:08 被阅读0次

    目的

    今天搭建一个数字选择游戏,根据提示选择对应数字,选择对则加分,否则减分。

    开始

    直接上代码,具体代码含义请看注释,这种方式应该比看文字方便快捷。

    1.搭建出数字选择内容

    /// 使用导航栏
            NavigationView {
                /// 使用垂直堆叠视图
                VStack {
                    /// 遍历0-2,识别id为自身
                    ForEach(0...2, id: \.self) {
                        /// 往VStack上面添加图片
                        Image(systemName: self.numbers[$0])
                            /// 设置图片可变化尺寸
                            .resizable()
                            /// 设置图片大小
                            .frame(width: 100, height: 100)
                            /// 设置图片边框及其颜色
                            .border(Color.black, width: 1)
                    }
                }
            }
    

    效果:


    image.png

    2.添加导航栏标题,内容为需要点击的数字

    struct ContentView: View {
        
        ...
        /// 设置需要点击的图片序号
        var selecte = Int.random(in: 0...2)
        
        var body: some View {
            /// 使用导航栏
            NavigationView {
                /// 使用垂直堆叠视图
                VStack {
                    ...
                }
                /// 设置标题
                .navigationBarTitle(Text("请点击:" + numbers[selecte].prefix(1)))
            }
        }
    }
    

    效果:


    image.png

    3.添加图片点击事件

    struct ContentView: View {
        ...
        var body: some View {
            ...
                        /// 往VStack上面添加图片
                        Image(systemName: self.numbers[num])
                            ...
                            /// 添加点击事件处理
                            .onTapGesture {
                                self.imageTap(tag: num)
                            }
                ...
            }
        }
        
        /// 点击了会调用该方法
        func imageTap(tag: Int) {
            print("点击了\(tag)")
        }
    }
    

    4.添加得分

    struct ContentView: View {
        ...
        /// 设置得分
        @State var score = 0
        ...
        /// 点击了会调用该方法
        func imageTap(tag: Int) {
            print("点击了\(tag)")
            if tag == selecte {
                score += 1
            } else {
                score -= 1
            }
            print("得分\(score)")
        }
    }
    

    5.弹出和隐藏Alert

    struct ContentView: View {
        ...
        /// Alert的显示与隐藏
        @State var isAlertShow = false
        /// Alert显示的内容
        @State var alertTitle = ""
        
        var body: some View {
            ...
                /// 设置标题
                .navigationBarTitle(Text("请点击:" + numbers[selecte].prefix(1)))
                /// 设置alert
                .alert(isPresented: $isAlertShow) { () -> Alert in
                    Alert(title: Text(alertTitle), message: Text("总分:\(score)"), dismissButton: .default(Text("继续"), action: {
                        
                    }))
                }
            }
        }
        
        /// 点击了会调用该方法
        func imageTap(tag: Int) {
            print("点击了\(tag)")
            if tag == selecte {
                score += 1
                alertTitle = "点对了"
            } else {
                score -= 1
                alertTitle = "点错了"
            }
            isAlertShow = true
            print("得分\(score)")
        }
    }
    

    运行:


    image.png

    6.刷新问题

    给numbers和selecte增加state属性装饰器

    struct ContentView: View {
        
        /// 设置0-8图片数组,打乱顺序
        @State var numbers = ["0.circle", "1.circle", "2.circle", "3.circle", "4.circle", "5.circle", "6.circle", "7.circle", "8.circle"].shuffled()
        /// 设置需要点击的图片序号
        @State var selecte = Int.random(in: 0...2)
        ...
                    Alert(title: Text(alertTitle), message: Text("总分:\(score)"), dismissButton: .default(Text("继续"), action: {
                        self.newQuestion()
                    }))
                }
            }
        }
        ...
        /// 刷新选项
        func newQuestion() {
            numbers.shuffle()
            selecte = Int.random(in: 0...2)
        }
    }
    

    现在点击继续,即可刷新下一个选项。

    完整代码

    import SwiftUI
    
    struct ContentView: View {
        
        /// 设置0-8图片数组,打乱顺序
        @State var numbers = ["0.circle", "1.circle", "2.circle", "3.circle", "4.circle", "5.circle", "6.circle", "7.circle", "8.circle"].shuffled()
        /// 设置需要点击的图片序号
        @State var selecte = Int.random(in: 0...2)
        /// 设置得分
        @State var score = 0
        /// Alert的显示与隐藏
        @State var isAlertShow = false
        /// Alert显示的内容
        @State var alertTitle = ""
        
        var body: some View {
            /// 使用导航栏
            NavigationView {
                /// 使用垂直堆叠视图
                VStack {
                    /// 遍历0-2,识别id为自身
                    ForEach(0...2, id: \.self) { num in
                        /// 往VStack上面添加图片
                        Image(systemName: self.numbers[num])
                            /// 设置图片可变化尺寸
                            .resizable()
                            /// 设置图片大小
                            .frame(width: 100, height: 100)
                            /// 设置图片边框及其颜色
                            .border(Color.black, width: 1)
                            /// 添加点击事件处理
                            .onTapGesture {
                                self.imageTap(tag: num)
                            }
                    }
                }
                /// 设置标题
                .navigationBarTitle(Text("请点击:" + numbers[selecte].prefix(1)))
                /// 设置alert
                .alert(isPresented: $isAlertShow) { () -> Alert in
                    Alert(title: Text(alertTitle), message: Text("总分:\(score)"), dismissButton: .default(Text("继续"), action: {
                        self.newQuestion()
                    }))
                }
            }
        }
        
        /// 点击了会调用该方法
        func imageTap(tag: Int) {
            print("点击了\(tag)")
            if tag == selecte {
                score += 1
                alertTitle = "点对了"
            } else {
                score -= 1
                alertTitle = "点错了"
            }
            isAlertShow = true
            print("得分\(score)")
        }
        
        /// 刷新选项
        func newQuestion() {
            numbers.shuffle()
            selecte = Int.random(in: 0...2)
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    

    总结

    使用SwiftUI,我们需要抛弃掉以前使用UIKit时候的很多思维,比如UIKite里面要弹出Alert,我们需要手动present,但是在SwiftUI,由于是MVVM架构,界面都应该由数据来控制,所以Alert的显示与隐藏绑定到一个属性,当属性值发生改变,则Alert自动显示与隐藏。

    相关文章

      网友评论

        本文标题:SwiftUI教程二:搭建一个数字选择游戏

        本文链接:https://www.haomeiwen.com/subject/zuqjcktx.html