点击TextField时.fullScreenCover自动消失的问题求助
我遇到一个奇怪的问题:点击TextField时,.fullScreenCover会自动消失。无键盘时视图能正常保留(附演示GIF),且代码中没有任何手动控制视图消失的逻辑,现有代码复杂难以生成最小复现示例。
调用.fullScreenCover的代码
TabView { ForEach(Array(allRecipes.chunked(into: 6)), id: \.self) { recipesChunk in LazyVGrid(columns: columns) { ForEach(recipesChunk, id: \.id) { recipe in self.item(image: recipe.recipeImage, title: recipe.recipeTitle, ingredients: recipe.ingredientItem, directions: recipe.directions, recipeID: recipe.id, recipeCaloriesMacro: recipe.recipeCaloriesMacro, recipeFatMacro: recipe.recipeFatMacro, recipeCarbMacro: recipe.recipeCarbMacro, recipeProteinMacro: recipe.recipeProteinMacro, prepTime: recipe.recipePrepTime) .onTapGesture { selectedRecipe = recipe } } }.frame(maxHeight: .infinity, alignment: .top) .fullScreenCover(item: $selectedRecipe){ RecipeControllerModal(name: $0.recipeTitle, prepTime: $0.recipePrepTime, image: $0.recipeImage, ingredients: $0.ingredientItem, directions: $0.directions, recipeID: $0.id, recipeCaloriesMacro: $0.recipeCaloriesMacro, recipeFatMacro: $0.recipeFatMacro, recipeCarbMacro: $0.recipeCarbMacro, recipeProteinMacro: $0.recipeProteinMacro) } } }
TextField代码
TextField("ex. I am a textfield", text: $userDirection) .font(.body) .padding(.leading, 45) .padding(.top, 15)
排查方向
绑定对象稳定性检查
.fullScreenCover(item:)依赖Identifiable协议实现,确认Recipe类型的id是否在键盘弹出/TextField交互时意外变更。如果id动态生成或被修改,SwiftUI会判定selectedRecipe已变更,自动关闭弹窗。同时检查父视图中selectedRecipe是否被意外重置,比如allRecipes重新加载时是否间接影响绑定值。调整.fullScreenCover作用域
当前.fullScreenCover附加在LazyVGrid上,而LazyVGrid处于ForEach循环内部。键盘弹出触发布局重计算时,网格视图可能重建导致弹窗被销毁。尝试将.fullScreenCover移到TabView外层,脱离内部网格的生命周期:TabView { // 原有网格代码... } .fullScreenCover(item: $selectedRecipe){ recipe in RecipeControllerModal(name: recipe.recipeTitle, prepTime: recipe.recipePrepTime, image: recipe.recipeImage, ingredients: recipe.ingredientItem, directions: recipe.directions, recipeID: recipe.id, recipeCaloriesMacro: recipe.recipeCaloriesMacro, recipeFatMacro: recipe.recipeFatMacro, recipeCarbMacro: recipe.recipeCarbMacro, recipeProteinMacro: recipe.recipeProteinMacro) }排查Modal内部逻辑
检查RecipeControllerModal中是否存在其他绑定/状态变化,在TextField获焦时间接将selectedRecipe置为nil。可以先替换成只包含TextField的最简Modal,验证问题是否复现,逐步缩小排查范围。避免不必要的视图重建
键盘弹出会触发布局调整,若LazyVGrid因布局变化重建,会导致关联的.fullScreenCover销毁。检查allRecipes.chunked(into:6)的实现,确保返回的chunk对象标识稳定(避免id: \.self生成新值),也可给LazyVGrid添加固定标识减少重建。
内容的提问来源于stack exchange,提问作者Swink

