访问全局函数内的环境变量 - SwiftUI + CoreData

2024-06-28

我正在开发一个列表应用程序,并且我有一些针对一种特定数据类型的添加/删除/编辑/加载功能,但是我想概括这些功能,这样我就可以从内部对任何数据类型执行相同的操作任何观点。

我已经设置了一个全局变量类:

import SwiftUI
import CoreData

class GlobalVariableClass: ObservableObject {
   @Published var itemObjects: [NSManagedObject] =  []
}

将类的实例放置在 SceneDelegate 中

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   var globalVariables = GlobalVariableClass()

   ...

将实例传递给 contentView

let contentView = Home()
         .environmentObject(globalVariables)
         .environment(\.managedObjectContext, context)

现在当我宣布@EnvironmentObject var globalVariables: GlobalVariableClass任何里面view,我可以访问itemObjects,它存储输入到文本字段中的所有项目。

这很棒,但我正在尝试使用不在视图内的全局函数。

我将它们声明在全局级别的单独文件中,以便它们具有公共访问权限。

确切的问题在下面do block.

func loadItems() {

   guard let appDelegate =
      UIApplication.shared.delegate as? AppDelegate else {
         return
   }

   let managedContext =
      appDelegate.persistentContainer.viewContext

   let fetchRequest =
      NSFetchRequest<NSManagedObject>(entityName: "Item")

   do {
      GlobalVariableClass().itemObjects = try managedContext.fetch(fetchRequest)
   }   catch let error as NSError {
      print("Could not fetch. \(error), \(error.userInfo)")
   }
}

使用以下方式访问 itemObjectsGlobalVariableClass().itemObjects 结果我的应用程序中没有加载任何内容。

虽然如果我在 listItem 视图中声明加载函数,则声明环境对象globalVariables,然后将其更改为

do {
      globalVariables.itemObjects = try managedContext.fetch(fetchRequest)
   }

然后一切都加载得很好。

关于如何从全局函数中访问 itemObjects 有什么建议吗?


可能的方法是使用共享实例,例如

class GlobalVariableClass: ObservableObject {
   static var shared = GlobalVariableClass()     // << here !!

   @Published var itemObjects: [NSManagedObject] =  []
}

所以你可以使用它

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   var globalVariables = GlobalVariableClass.shared

and

   do {
      let results = try managedContext.fetch(fetchRequest)

      // make sure to modify itemObjects always in main queue
      DispatchQueue.main.async {    // << must !!
         GlobalVariableClass.shared.itemObjects = results
      }
   }   catch let error as NSError {
      print("Could not fetch. \(error), \(error.userInfo)")
   }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问全局函数内的环境变量 - SwiftUI + CoreData 的相关文章

  • Swift 中的等效 android.content.BroadcastReceiver

    我想知道 Swift 中是否有等效的 android content BroadcastReceiver 我需要相同的处理程序 例如onReceive Context context Intent intent 有可能的 谢谢 Ysee 在
  • 突出显示 PDF 文档 iPhone xcode 中的文本

    嗨朋友们 我正在使用 Web 视图开发一本电子书 我正在使用 PDF 文档加载 Web 视图 现在我想开发搜索功能 但我不明白如何实现它 所以请给我一个解决方案 提前致谢 而不是使用UIWebView 您可能想考虑使用 Quartz 2DC
  • SpriteKit中滚动背景的速度逐渐增加

    我正在 SpriteKit 中制作一个简单的游戏 并且我有一个滚动背景 简单的情况是 在加载游戏场景时 一些背景图像彼此相邻放置 然后当图像滚动到屏幕外时 图像会水平移动 这是我的游戏场景中的代码didMoveToView method s
  • 从 WatchOS 捕获 Apple Watch 的型号标识符

    似乎没有任何记录的官方方法可以从手表应用程序获取 Apple Watch 模型 但有一篇文章显示了特殊用途sysctlbyname 如何确定Apple Watch型号 https stackoverflow com questions 49
  • 编译到模拟器时如何排除 Xcode 中的框架

    我在我的项目中包含了 TokBox 框架 这样我们就可以进行视频短信 问题是该框架以及它们所需的其他一些框架不允许您在模拟器中编译或运行该应用程序 他们不受支持 有没有办法设置编译器标志以在编译到模拟器时跳过 TokBox 和其他框架 原因
  • 使用 XCode 5 的 iPhone 弹出窗口视图

    我想重复使用 iPhone 中描述的弹出窗口这个视频 http youtu be 1iykxemuxbk这正是我所需要的 问题是我无法绑定UIViewController弹出窗口的属性UIViewController就像视频中一样 该视频的
  • AVPlayer 持续时间对于 Twilio 来说是 NAN

    The duration的财产AVPlayer currentItem正在返回NAN总是与Twilio音频网址 不过 音频播放得很好 我能够得到duration除 Twilio 之外的所有其他音频 url 的属性 测试此问题的示例网址 ht
  • 我的应用程序二进制文件在 Xcode 中的哪里提交?

    我已经为 App Store 前 iTunes 商店 构建了一个应用程序 但是 我不知道如何提交应用程序 我需要提交到 App Store 的实际二进制文件在哪里 它内置在哪个文件夹中 您可以使用 XCode 并在左侧展开 产品 突出显示您
  • 无法打开文件,因为您无权查看该错误

    我在 Google 上搜索并浏览了 Stack Overflow 似乎找不到解决方案 我有 let fileURL URL string file Users me file txt var rawDataString String var
  • 在旧版 iOS 模拟器上运行时 Xcode 10 测试失败 - “无法加载测试包...找不到合适的图像”

    我已经安装了 Xcode 10 并将我的 iOS 应用程序升级到 Swift 4 2 当我通过 Xcode 在运行 iOS 12 的 iPhone 模拟器上运行测试 UI 和 Unit 时 测试成功启动 当我尝试在运行先前 iOS 版本 例
  • 在启用垂直分页的 UIScrollView 中垂直滚动

    希望你能给我一些指导 我有一个带有垂直分页的滚动视图设置 我的问题是视图大于屏幕 垂直 我想要的效果是让视图滚动到底部 然后翻到下一页 就像我下面的图片试图描绘的那样 我尝试将滚动视图的大小和内容大小设置为视图的大小 这确实正确地偏移了视图
  • 如何将数据从 swift 传递到 javascript?

    我知道如何将数据从 javascript 传递到 swift 但不知道如何将数据从 swift 传递到 javascript 我用来将数据从 javascript 传递到 swift 的方法如下 h1 WebView Test 3 h1
  • Xcode 7.3.1 UITests 代码覆盖率始终为 0%

    除了主应用程序之外 我的项目中还有两个单独的单元测试和 UI 测试目标 这两个目标有不同的方案 以便我可以分别在我的 CI 服务器上运行它们 我在这两个方案中都检查了 收集代码覆盖率 最初 我通过使用 Cmd U 分别构建和运行这两个方案来
  • Xcode 4:如何更改 ${EXECUTABLE_NAME} 变量的值?

    我想找到 xcode 4 2 中定义的 EXECUTABLE NAME 全局变量在哪里 您的目标 gt 构建设置 gt 产品名称
  • Swift 错误:“找不到‘SKScene’的接口声明,其超类”

    免责声明 我通读了类似的问题 找不到解决我的问题的方法 我想将 SKScene 的子类添加到以前未使用 SpriteKit 的项目中 该项目是 ObjC 和 Swift 的混合体 子类是用 Swift 编写的 我做了什么 通过转到项目 gt
  • Xcode 4.3.2 足以为 iOS 6 构建应用程序吗?

    在今天宣布 iOS 6 Beta 可供开发人员使用之后 我想知道如果我尽快使用 iOS 6 我是否仍然能够在我的设备 iPhone 上从 Xcode 4 3 2 构建正在进行的应用程序 或者 Xcode 也需要更新吗 更新 目前我的 iPh
  • iAd Banner不出现但是代码和右边

    我的 iAd 遇到问题 我遵循了许多高质量的教程 几天前我能够在测试应用程序中正确插入 iAd 现在 即使我尝试创建一个仅使用 iAd 的新应用程序作为测试 该方法也不起作用 我无法理解以下文本中出现的问题 我使用 xCode 5 和 iO
  • 升级到 Xcode 3.2.5 后出现“Base SDK Missing”

    所以我采取了升级到 Xcode 3 2 5 iPhone SDK 4 2 的步骤 现在我无法运行到设备 我现在总是在开发环境中看到这一点 在我当前的项目中 当进入项目设置时 我只能将 Base SDK 设置为 iOS 4 2 但这并不能改变
  • 如果用户应答传入的 iMessage,WKWebView 会崩溃

    我的应用程序发生严重崩溃 CALayer position contains NaN 377 833 nan 具有以下堆栈 Fatal Exception CALayerInvalidGeometry 0 CoreFoundation 0x
  • DispatchQueue.main.sync 返回 exc_bad_instruction Swift 3

    我想在我的应用程序中显示 UIActivityIndi catorView 但是当我调用sync方法从主线程 应用程序崩溃并出现错误 exc bad instruction code exc i386 invop subcode 0x0 我

随机推荐