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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 17:12:52