SwiftUI中Alert内TextField默认值无法重复显示的问题咨询
SwiftUI Alert中TextField默认值不保留的问题解决
你的问题不是Alert里的TextField不支持保留默认值,而是当前的实现逻辑导致了这个现象。
问题原因
你直接把TextField绑定到了editing_name这个@State变量上:
- 首次打开Alert时,
editing_name是初始值"hogehoge",所以TextField显示这个值。 - 如果你在TextField中修改了内容,哪怕点击取消按钮,
editing_name已经被更新为修改后的内容(双向绑定会实时生效)。 - 后续再打开Alert时,TextField会显示
editing_name的当前值(也就是上次修改后的值),而非初始默认值。 - 另外,SwiftUI的Alert在关闭后会销毁内部视图,再次打开时会重新初始化,但因为绑定的变量值已经改变,所以不会再显示原来的默认值。
解决方法
使用一个临时变量存储Alert中TextField的输入内容,只有在用户点击确认按钮时,才把临时值同步到目标变量上:
import Foundation import SwiftUI struct AlertTestView: View { @State private var editAlert: Bool = false @State private var editing_name: String = "hogehoge" // 新增临时变量用于Alert内的输入 @State private var tempName: String = "" var body: some View { Text("editing_name:\(editing_name)") Button("Alert"){ // 打开Alert前,将当前默认值赋值给临时变量 tempName = editing_name editAlert = true } Button("Alert with other default value"){ tempName = "piyo piyo" editAlert = true } .alert("enter_new_book_name", isPresented: $editAlert) { // TextField绑定到临时变量 TextField("", text: $tempName) Button("change"){ // 确认时同步临时值到目标变量 editing_name = tempName } Button("cancel", role: .cancel) { // 取消时无需操作,临时变量会在下次打开时重新赋值 } } } }
效果说明
- 每次打开Alert前,都会把需要的默认值(当前的
editing_name或者指定的"piyo piyo")赋值给临时变量tempName,确保TextField始终显示正确的默认值。 - 用户点击确认按钮时才会同步值到目标变量,避免取消操作也修改
editing_name。 - 关闭Alert后,临时变量的值不会影响后续打开时的默认值,因为每次打开前都会重新赋值。
内容的提问来源于stack exchange,提问作者crept
相关产品推荐
相关产品推荐

