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

点击TextField时.fullScreenCover自动消失的问题求助

fullScreenCover点击TextField自动消失问题排查方案

我遇到一个奇怪的问题:点击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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:26:02