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
相关产品推荐
相关产品推荐

