SwiftUI保存用户资料数据及导航跳转失效问题求助
问题解决:姓名输入、导航跳转及保存失效问题
一、修复NavigationLink警告与跳转失效问题
旧的NavigationLink(isActive:)在iOS 16+已被弃用,改用NavigationStack结合navigationDestination是正确方向,调整方式如下:
- 先定义导航路径状态变量:
@State private var navigationPath = NavigationPath()
- 用
NavigationStack包裹页面全部内容,替换原隐藏的NavigationLink:
NavigationStack(path: $navigationPath) { // 你的页面内容(包含姓名输入框、Done按钮等) Button(action: { saveName() navigationPath.append("Profile") // 通过路径跳转触发页面切换 }) { Image("done").resizable().aspectRatio(contentMode: .fit) .frame(width: 103, height: 103) .padding(.leading,259) .padding(.bottom,740) } // 配置导航目标 .navigationDestination(for: String.self) { value in if value == "Profile" { Profile() } } }
二、解决姓名无法保存的问题
核心要确保输入框和profilename是双向绑定状态:
- 先给
profilename添加状态包装,同时从UserDefaults初始化:
@State private var profilename = UserDefaults.standard.string(forKey: "User_Name") ?? ""
- 输入框必须绑定这个变量:
TextField("请输入姓名", text: $profilename)
- 可以在
saveName()里加打印验证,确认内容已被捕获:
private func saveName() { print("当前要保存的姓名:\(profilename)") UserDefaults.standard.set(profilename, forKey: "User_Name") }
如果profilename没有用@State/@Binding修饰,输入的内容根本无法被保存方法获取。
三、解决fullScreenCover点击输入框触发跳转的问题
这个问题是状态变量donetapped被意外触发导致的,检查以下两点:
- 确保只有点击Done按钮时才修改
donetapped:
@State private var donetapped = false Button(action: { saveName() donetapped = true }) { // Done按钮样式 } .fullScreenCover(isPresented: $donetapped) { Profile() }
- 检查姓名输入框的代码,有没有额外的手势或绑定逻辑不小心修改了
donetapped变量,比如误加了onTapGesture触发跳转。
内容的提问来源于stack exchange,提问作者Jhon Kim
相关产品推荐
相关产品推荐

