SwiftUI中TextField每输入一个字符就重置,求技术解决方案
问题解决:SwiftUI TextField输入后重置为初始值
问题根源
你遇到的问题是因为Player实例的生命周期没有被正确管理,导致每次视图刷新时,要么创建了新的Player对象,要么实例没有被稳定持有,输入的内容无法被持久化保存。
两种修复方案
方案一:让视图自行持有数据源(推荐)
使用@StateObject替代@ObservedObject,确保Player实例在视图的整个生命周期内保持稳定,不会被重建:
import SwiftUI class Player: ObservableObject { @Published var playerData = "player 1" } struct ContentView: View { // @StateObject负责管理对象的生命周期,确保视图刷新时实例不丢失 @StateObject private var player = Player() var body: some View { TextField("player", text: $player.playerData) } }
方案二:使用全局实例并正确传递
如果你坚持使用全局的Player实例,需要确保在初始化ContentView时传入同一个全局实例,避免创建新对象:
import SwiftUI class Player: ObservableObject { @Published var playerData = "player 1" } // 全局实例 let player = Player() struct ContentView: View { @ObservedObject var player: Player var body: some View { TextField("player", text: $player.playerData) } } // 在App入口或父视图中传入全局实例 struct YourApp: App { var body: some Scene { WindowGroup { ContentView(player: player) } } }
为什么原代码失效
原代码中如果没有显式传入全局的player实例(比如直接调用ContentView()),Swift会自动生成默认初始化器,每次都创建新的Player对象。视图刷新时这个新对象会被重新初始化,导致输入的内容被重置回"player 1"。
内容的提问来源于stack exchange,提问作者Carmen_1994
相关产品推荐
相关产品推荐

