在另一个视图中更新核心数据实体后,SwiftUI 列表视图未更新

2023-12-15

我有一个存储在核心数据中的课程实体,其变量之一是存储课程是否完成。

这些课程列在 SwiftUI 列表中,选择后会转到游戏所在的视图。游戏完成后,complete 变量将更新为 true。应该发生的情况是列表视图显示列出的游戏,并在游戏旁边显示一个复选标记。

然而,发生的情况是,当我在游戏中保存课程的“已完成”状态时(在 tapRight 方法中 - 见下文),我收到警告:

[TableView] 仅警告一次:UITableView 被告知在不位于视图层次结构中的情况下布局其可见单元格和其他内容(表视图或其超级视图之一尚未添加到窗口中)。

然后,当我通过按游戏视图顶部的导航按钮返回列表视图时,我发现游戏已从列表中消失。

但是,当我关闭应用程序并重新打开它时,列表中包含游戏行和复选标记,因此我知道核心数据课程实例正在正确更新。下面的列表视图代码。

import SwiftUI
import CoreData
import UIKit

struct LessonList: View {

@Environment(\.managedObjectContext) var moc

@State private var refreshing = false
private var didSave =  NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)

@FetchRequest(entity: Lesson.entity(), sortDescriptors: [], predicate: NSPredicate(format: "(type == %@) AND (stage == %@) AND ((complete == %@) OR (complete == %@))", "phonicIntro", "1", NSNumber(value: true), NSNumber(value: false) )) var phonicIntroLessons1: FetchedResults<Lesson>

var body: some View {

    NavigationView {      
        List {
            self.stage1Section
        }
        .navigationBarTitle("Lessons")
    }
}


private var phonicIntroLink : some View {
    ForEach(phonicIntroLessons1) { lesson in
        NavigationLink(destination: PhonicIntroGame(lesson: lesson)) {
            LessonRow(lesson: lesson)
        }
    }
}

private var stage1Section : some View {
    Section(header: Text("Stage 1")) {
        phonicIntroLink
    }.onReceive(self.didSave) { _ in
        self.refreshing.toggle()
    }
}

游戏View中保存完成状态的相关代码:

import SwiftUI
import AVFoundation

struct PhonicIntroGame: View {

@Environment(\.managedObjectContext) var moc

var lesson: Lesson?

func tapRight() {
    if ((self.lesson?.phonicsArray.count ?? 1) - 1) > self.index {
        self.index = self.index + 1
        print("This is index \(self.index)")
        //On completion
        if (index + 1)  == (lesson!.phonicsArray.count) {
            self.lessonComplete()
        }
    } else {
        print(self.index)

func lessonComplete() {
    self.lesson?.setComplete(true)
    self.saveLesson()
}

func saveLesson() {
    do {
        try moc.save()
    } catch {
        print("Error saving context \(error)")
    }
}

在 NSManagedObject 子类中:

extension Lesson {

func setComplete (_ state: Bool) {
    objectWillChange.send()
    self.complete = state
}
}

LessonRow的代码如下:

import SwiftUI
import CoreData

struct LessonRow: View {

@Environment(\.managedObjectContext) var moc
@State var refreshing1 = false
var didSave =  NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)
var lesson: Lesson

var body: some View {
        HStack {
            Image(lesson.wrappedLessonImage )
                .resizable()
                .frame(width: 80, height: 80)
                .cornerRadius(20)

            Text(lesson.wrappedTitle)
                .font(.system(size: 20))
                .fontWeight(.thin)
                .padding()

            if lesson.complete == true {
                Image(systemName: "checkmark.circle")
                    .resizable()
                    .frame(width: 30, height: 30)
                    .foregroundColor(.green)
            } else {
                Rectangle()
                    .frame(width: 30, height: 30)
                    .foregroundColor(.clear)
            }
        }.padding()
            .onReceive(self.didSave) { _ in
                self.refreshing1.toggle()
            }


   }
}

我尝试过的事情:

  1. 强制列表重新加载通知和 .onReceive
  2. 使用 setComplete 函数设置 Lesson NSManagedObject 子类,该函数调用“objectWillChange”
  3. 通过包含完整变量的 true 和 false 使 @FetchRequest 更加详细

对于如何解决此问题的任何建议,我将不胜感激。我是 SwiftUI 的新手,所以提前感谢您的帮助。


是的,我最终解决这个问题的方法是将 @ObservedObject 添加到 PhonicIntroGame : View 中的存储对象中。如下 -

@ObservedObject var lesson: Lesson
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在另一个视图中更新核心数据实体后,SwiftUI 列表视图未更新 的相关文章

  • 我可以指定泛型是值类型吗?

    我知道我们基本上可以通过使用指定我们的泛型是任何引用类型AnyObject class Foo
  • Firestore 读取包含子集合的文档的计费

    我正在制作一个应用程序 它存储用户使用我的应用程序学习了多少分钟 我的 Firestore 数据库以 用户 集合开始 每个用户都有自己的文档 该文档由其在 Auth 中生成的 userID 命名 我的问题是 如果我读取了他们的 userID
  • 我在 NSDateComponentsFormatter 上的 allowedFractionalUnits 上做错了什么?

    基本上我想要的是获取仅以小时表示的时间间隔的值 而不将其四舍五入为完整小时 使用NSDateComponentFormatter https developer apple com library ios documentation Fou
  • 如何使用 SwiftUI 创建自定义滑块?

    我可以使用 SwiftUI 创建滑块 但无法更改滑块的样式 如下图所示 问题 我无法在 SwiftUI 中找到任何选项来更改滑块样式 注意 我想仅使用 SwiftUI 创建它 我已经在 Swift 中使用 创建了这个滑块 https git
  • Swift 在调试和发布模式下的行为不同

    不确定这是否是 Swift XCode 或 Alamofire 的问题 但我认识到我的混合 Swift Objc 应用程序中不同地方的奇怪行为 它只发生在用 Swift 编写并使用闭包 网络的部分 这是发生这种情况的示例代码 Alamofi
  • 如何扩展 Array 以获得泛型类型?

    我有一个链表类 声明如下 class LinkedNode
  • 依赖于 pod 的 Swift 通用框架

    我正在开发一个依赖于 Alamofire 的小型 Swift 框架 我将它用作属于同一工作区的应用程序的嵌入式框架 并且它运行良好 当我想构建一个具有总体目标的通用框架时 问题就出现了 然后 当执行脚本生成框架时 它失败并显示消息No su
  • 访问 UserDefault 数组 URL 以填充 CollectionView

    这是上一篇文章的后续内容here https stackoverflow com questions 48142238 save and append an array in userdefaults from imagepickercon
  • 在 Swift 中将半精度浮点数(字节)转换为浮点数

    我希望能够从二进制文件中读取半浮点数并将它们转换为 Swift 中的浮点数 我查看了来自其他语言 例如 Java 和 C 的几种转换 但是我无法获得与半浮点相对应的正确值 如果有人可以帮助我实施 我将不胜感激 从 Float 到 Half
  • 在 WidgetKit 中每分钟更新时间文本标签

    是否可以在小部件中创建显示当前时间并实时更新的文本标签 尝试创建时钟小部件 但小部件每 5 分钟仅更新 1 次 创建时间表没有帮助 使小部件保持最新 不适用于当前时间 仅适用于计时器等 一个可能的解决方案是使用time日期样式 A styl
  • 在 iOS Swift 2 中实现“阅读更多”按钮以展开 UITextView 的最简单方法?

    我希望实现一个 阅读更多 按钮 该按钮将扩展 UITextView 以便有人可以根据需要阅读整个文本 我还没有找到一种简单的方法来实现这一目标 我尝试 玩弄 容器的高度 但它没有给我想要的结果 我真的很感激任何想法 我会推荐你 ilyapu
  • iOS 9 中可滑动的表格视图单元格

    我希望我的表格列表具有像 iOS 8 中那样的可滑动菜单 首次在 iOS 7 中引入 我找到了清晰的 Ray Wenderlich 指南 http www raywenderlich com 62435 make swipeable tab
  • 我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

    在我的项目中 我将所有私有 swift 2 3 文件迁移到 swift 3 我想使用用 swift 2 3 编写的遗留框架 直到它们有 swift 3 版本 我尝试添加 使用旧版 Swift 版本 是 清除 构建我的项目 但我仍然遇到一些麻
  • 如何跟踪 SwiftUI 应用程序中的所有触摸

    我正在尝试在 SwiftUI 应用程序中实现锁屏 我需要跟踪每个事件才能重新启动锁定计时器 在 UIKit 应用程序中 我使用了这种方法 重写 UIApplication 它允许了解应用程序中的任何事件 override func send
  • Swift :基于 nsdate() 解析、查询日期字段

    我正在尝试检索今天添加的记录进行解析 但查询不返回任何结果 我怎样才能让查询返回基于今天日期的结果 let now NSDate var query PFQuery className userBids query whereKey dat
  • Xcode 11 - 在 Catalyst Swift 中禁用调整大小模式

    We are 将我们基于 Swift 的 iOS 应用程序转换为 Mac兼容使用Catalyst在 Xcode 11 中 当用户使用时 我们在 UI 中面临一个问题resize应用程序窗口 那么我们可以禁用调整大小模式并为应用程序窗口提供修
  • 解析迁移到 mLabs 和 Heroku 的错误

    我至少一年前将解析数据库迁移到 Mlabs 从那时起我就一直在开发该应用程序 解析仪表板表示我已成功迁移 Mlab 和 Parse 都收到了数据库的更新 然而 在过去一两周内 该应用程序不再经过登录页面 没有调整代码 这是服务器问题 以下是
  • 在 Safari 中快速打开链接

    我目前正在我的应用程序中打开链接WebView 但我正在寻找一个打开链接的选项Safari反而 它不是 融入 Swift 但你可以使用标准UIKit方法来做到这一点 看看 UIApplication 的openUrl https devel
  • UNTimeIntervalNotificationTrigger nextTriggerDate() 是否给出了错误的日期?

    我正在更新本地通知以与 iOS 10 配合使用 但遇到了一个问题 我认为 nextTrigger 函数返回的不是 满足触发条件的下一个日期 而是返回当前日期时间加上您最初设置 UNTimeInvervalNotificationTrigge
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代

随机推荐

  • IronPython 和 C# - 对 C# 对象的脚本访问

    考虑下面的代码 ScriptRuntimeSetup setup Python CreateRuntimeSetup null ScriptRuntime runtime new ScriptRuntime setup ScriptEngi
  • Android Studio 中的 ListFragment

    我正在浏览在线教程 试图了解 ListFragment 的工作原理以及我们如何使用它 这些教程有点模糊 我无法理解它到底是如何工作的 也无法在 Android Studio 上实现 ListFragment 有人可以提供有关 ListFra
  • 从分层 JSON 中挑选出简单属性

    尽管其他用户对我的标题进行了编辑 但我正在寻找一种使用 C 中的 JSON NET 库的解决方案 包含伪代码的回复就可以了 我正在尝试使用 JSON 数据集提供的分层数据 我正在使用 C 和 JSON NET 如果有帮助的话 我愿意一般 使
  • HTTP 页面正在删除我的安全 cookie

    我有一个混合 HTTP HTTPS 的网站 当用户登录时 她会收到两个 cookie 包含她 签名 用户名 登录过期时间和 不安全 标志的常规 cookie a secure cookie with her signed username
  • 使用 Python 和 Beautiful Soup 4 抓取 Twitter 时专注于特定结果?

    这是我的帖子的后续内容使用 Python 抓取 Twitter 中的嵌套 Div 和 Spans 我没有使用 Twitter API 因为它不会通过以下方式查看推文 话题标签这么远 完整的代码和输出如下示例所示 我想从每条推文中抓取特定数据
  • Jmeter 在每次 http 请求后清除 cookie

    在jmeter上下文中 有没有办法在同一线程组内的每个http请求之后清除cookie 在这种情况下 为什么您需要 HTTP Cookie 管理器 只需将其删除 您就会得到预期的行为 以防万一您遇到某种形式的奇怪的负面测试场景 Add a
  • 啊?添加 SDK 1.6 后 Android 首选项页面拒绝加载

    这个实在是太奇怪了 我有一个完美运行的 Eclipse Android 2 2 SDKboth管理员帐户andWindows XP 下的 LUA 有限用户帐户 然后我决定添加 Android 1 6 SDK 我只能通过管理员帐户来完成 看起
  • 如何将另一个站点的所有产品导入到magento站点

    嗨 任何人都可以帮助我吗 我已经在实时服务器上安装了magento 现在我想导入已准备好实时运行的网站的所有产品和类别 我该怎么做 请提供帮助 请参阅 Magento 维基 如何使用导入 导出工具添加 编辑 删除产品 Magento 比较特
  • 重载 Haskell 中的内置函数

    在 Haskell 中 如何重载内置函数 例如 我最初是想弄清楚如何重载内置函数 通过自己的数据类型来支持 具体来说 属于以下类型 a gt Int gt a 我想保留它的现有功能 但也能够在其类型签名看起来更像的地方调用它 MyType1
  • 关于 C# 使用 foreach 循环添加对象到列表

    foreach string f in fileName if list Where p gt p FileName Trim Equals f Trim StringComparison OrdinalIgnoreCase Count 0
  • 为什么我无法在标准机器学习中比较实数?

    为什么不1 0 2 0工作 不是real平等类型 它给出了错误 Error operator and operand don t agree equality type required operator domain Z Z operan
  • iPhone 中的 mailto 链接添加加号而不是空格

    我现在正在构建一个网络应用程序 需要使用 mailto 链接作为 告诉朋友 部分 消息正文对于 URL 来说太长 因此我将其置于隐藏表单中 并通过 jQuery 发送该表单 一切都工作得很好 除了在空格应该去的地方添加了 号 我尝试过取消转
  • 如何在 MS Access 查询中设置日期格式以防止美国/英国问题

    在访问查询中过滤日期时 如何确保选择正确数量的记录 SELECT ID REF SalesDate DCount ID tblRecords Ref Ref AND SalesDate format SalesDate yyyy mm dd
  • 通过引用传递 IDisposable 对象会导致错误?

    我正在尝试创建一个通用方法来处理实现的对象I一次性 称为DisposeObject 为了确保我正在处理原始引用指向的对象 我尝试通过引用传递对象 但我收到一个编译错误 上面写着 ref 参数类型与参数类型不匹配 在下面的 简化的 代码中 两
  • SharePoint 2010 / IIS 7.5 字节范围请求响应整个文件

    我在让 SharePoint 2010 IIS 7 5 尊重字节范围请求时遇到问题 我正在使用 Silverlight 开发 SharePoint 2010 Web 部件 并尝试检索存储在 SharePoint 中的部分文档 当我在 Sha
  • jquery UI 可通过表格和 tr 宽度进行排序

    我正在使用 jQuery UI sortable 来使我的表格网格可排序 该代码似乎工作正常 但因为我没有添加宽度tds 当我拖动tr它缩小了内容 例如 如果我的表格行是 500 像素 当我开始拖动时 它会变成 300 像素 我认为发生这种
  • 如何在鼠标悬停时暂停 Bootstrap 轮播并在鼠标移开时恢复它?

    我的网站上有一个 Bootstrap 轮播 当用户将鼠标悬停在某个元素上时 formcontainer 我想暂停轮播 当我悬停时 我想继续旋转木马的循环 第一部分可以与以下代码配合使用 但第二部分则不行 有人可以帮忙吗 document r
  • 您的内容必须有一个 id 属性为“android.R.id.list”的 ListView

    我创建了一个像这样的 xml 文件
  • Python 列表字典中的最小值

    抱歉 问题重新发布了 我应该首先编辑这个问题 为模组标记了新的 抱歉 添麻烦了 由于要求发生变化 不得不重新编写问题 我有一本字典 如下所示 d a 4 2 b 3 4 c 4 3 d 4 3 e 4 f 4 g 4 我想获取与字典 d 中
  • 在另一个视图中更新核心数据实体后,SwiftUI 列表视图未更新

    我有一个存储在核心数据中的课程实体 其变量之一是存储课程是否完成 这些课程列在 SwiftUI 列表中 选择后会转到游戏所在的视图 游戏完成后 complete 变量将更新为 true 应该发生的情况是列表视图显示列出的游戏 并在游戏旁边显