You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI Button空输入拦截跳转及LaunchView向FirstView传参问题

1. 实现非空校验后跳转游戏页面

你可以用SwiftUI的导航组件实现页面跳转,iOS 16及以上推荐用NavigationStack方案,修改后的LaunchView代码如下:

import SwiftUI

struct LaunchView: View {
    // 用户名绑定变量(你原有代码应该已经定义,这里补全示例)
    @State private var username = ""
    @State private var showingAlert = false
    // 新增:控制跳转FirstView的状态变量
    @State private var goToFirstView = false
    
    var body: some View {
        NavigationStack { // 外层包裹导航容器
            VStack {
                // 这里是你原有用户名输入框代码
                TextField("请输入用户名", text: $username)
                    .textFieldStyle(.roundedBorder)
                    .padding()
                
                Button(action: {
                    if username.isEmpty {
                        showingAlert = true
                    } else {
                        // 触发跳转逻辑
                        goToFirstView = true
                    }
                }) {
                    Text("PLAY")
                        .padding()
                        .foregroundColor(.black)
                        .frame(width: 350)
                        .background(Color.white)
                        .clipShape(Capsule())
                        .shadow(radius: 15)
                    
                }
                .alert(isPresented:$showingAlert) {
                    Alert(
                        title: Text("错误"),
                        message: Text("请输入用户名"),
                        dismissButton: .cancel()
                    )
                }
                // 配置跳转目标
                .navigationDestination(isPresented: $goToFirstView) {
                    // 跳转同时把username传给FirstView,同步解决第二个传值问题
                    FirstView(username: username)
                }
            }
        }
    }
}

如果你的项目需要兼容iOS 15及更早版本,把NavigationStack换成NavigationView,用NavigationLink的isActive参数配置跳转即可。

2. 跨页面获取username变量

最简单的方案是通过构造函数传值,只需要两步修改:

  • 第一步:给FirstView新增username存储属性,修改alert的展示文案
    修改后的FirstView相关代码如下:
import SwiftUI

struct FirstView: View {
    // 新增:接收外部传入的username
    let username: String
    // 你原有代码已经定义的变量
    @State private var showingScore = false
    @State private var scoreTitle = ""
    @State private var point = 0
    
    var body: some View {
        // 你原有页面布局逻辑
        Text("游戏页面")
            .alert(isPresented: $showingScore) {
                Alert(
                    title: Text(scoreTitle),
                    // 修改message文案,插入username变量
                    message: Text("\(username), your score is \(point)"),
                    dismissButton: .default(Text("Continue")) {
                        self.askQuestion()
                    }
                )
            }
    }
    
    // 你原有逻辑的askQuestion方法
    func askQuestion() {
        // 原有逻辑不变
    }
}

如果后续有多个页面都需要用到用户名,也可以用@EnvironmentObject全局注入的方式管理,不需要每层页面都传递参数。

内容的提问来源于stack exchange,提问作者razvan2003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:57:02