Context

我有一个非常基本的SwiftUI设置,其中ListView表示所有实体,DetailView表示这些实体中的单个实体.DetailView还有一个删除选项.

我的问题是,当删除实体时,SwiftUI不会导航回ListView,即使@FetchRequest应该更新并重画包括ChildView的视图.相反,它一直显示DetailView,但由于删除了实体,它只显示其名称的定制实现的缺省值("N/A").


Code

struct ListView: View {
    @FetchRequest(sortDescriptors: []) var entities: FetchedResults<Entity>

    var body: some View {
        NavigationStack {
            ForEach(entities) { entity in
                RowView(entity: entity)
            }
        }
    }
}

struct RowView: View {
    @ObservedObject var entity: Entity

    var body: some View {
        NavigationLink(destination: DetailView(entity: entity)) {
            Text(entity.name)
        }
    }
}

struct DetailView: View {
    @Environment(\.managedObjectContext) private var context
    @ObservedObject var entity: Entity
    
    var body: some View {
        VStack {
            Text(entity.name)
            
            Button(action: { delete() }) { Text("Delete") }
        }
    }

    private func delete() {
        context.delete(entity)
        
        do {
            try context.save()
        } catch let error as NSError {
            print(error)
        }
    }
}

Question

  • 为什么SwiftUI在删除时不导航回ListView,即使@FetchRequest应该更新?我怎样才能达到这个目标呢?

推荐答案

FetchRequest会更新,但导航链接不依赖于父级的FETCH请求--它不像sheetfullScreenCover那样,isPresenteditem绑定的属性决定新视图的可见性.

最简单的做法是使用dismiss环境函数自己处理解雇:

struct DetailView: View {
    @Environment(\.dismiss) private var dismiss
    @Environment(\.managedObjectContext) private var context

    // ...

    private func delete() {
        dismiss()
        context.delete(entity)
        // ...
    }
}

虽然dismiss()更常见的是像工作表和全屏封面这样的情态工具,但它也可以在导航堆栈中使用,将当前视图从堆栈中弹出.

Ios相关问答推荐

底部导航栏在iOS上浮动

AVFoundation Camera推出变焦SWIFT

为什么iOS委派在KMM中不能正常工作?

flutter中实现自定义底部导航栏

无法关闭包含字体 Select 器的工作表

在 iOS 上以后台模式安排任务(屏幕时间 API)

如何在Combine发布者之间强制执行最小延迟

创建方案时运行 pod install 时出错

如何解决错误 HE0004:无法在 Visual Studio 2022 中加载框架ContentDeliveryServices

Flutter iOS 构建失败:DVTCoreDeviceEnabledState_Disabled

UIView 倒置旋转时的zoom 问题

expo EAS build (iOS) 在 Pod 安装步骤中失败 (SDK45 & 46)

为 ColorPicker 创建一个名为 Color 的计算变量的绑定

有哪些可靠的机制可以防止 CoreData CloudKit 中的数据重复?

如何在 Swift 中旋转 UIButton 和 UILabel 的文本?

在 Swift 中按下返回键时在文本字段之间切换

如何设置imageView的圆角半径?

用 PC 调试 ipad safari

从 Swift 转换为 Objective-c 的工具

在 NSUserDefaults 中保存图像?