问题标签 [environmentobject]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
61 浏览

swift - 如何在 Swift 中使用 .environmentObject() 将值从视图传递给 ViewModel?

我创建了一个带有 init() 的 ViewModel,它接受类似这样的参数。PS:学习swift和swiftUI

UserData 是我有一个函数 getUsers(byCategory) 的数据模型,它允许我获取数据子集而不是所有数据,然后对其进行过滤。

对于我的 SwiftUI 视图

在用户选择一个类别后,上面的 SwiftUI View 会被另一个 ListView 调用。如何在不在这里硬编码的情况下通过该类别?

0 投票
1 回答
57 浏览

mvvm - EnvironmentObject 视图模型中的计时器不更新视图

我有一个视图模型,它有多个子视图模型。我对 watchOS、SwiftUI 和 Combine 还很陌生——借此机会学习。

我有一个 watchUI

  1. 播放按钮(视图) -SetTimerPlayPauseButton
  2. 显示时间的文本(视图) -TimerText
  3. 查看模型 - 具有 1 WatchDayProgramViewModel- N: ExerciseTestClass- N: SetInformationTestClass。对于每个练习集,都有一个watchTimer & watchTimerSubscription,我已经设法运行计时器来更新剩余的休息时间。
  4. ContentView - 已将 ViewModel 注入为EnvironmentObject

如果我点击SetTimerPlayPauseButton启动计时器,则计时器正在运行、工作并正确更改剩余RestTime(子视图模型中的属性SetInformationTestClass),但更新/更改不会“发布”到TimerTextView

我已经完成了其他 SO 答案中的大部分(如果不是全部)建议,我什至完成了我的所有WatchDayProgramViewModeland ExerciseTestClass, SetInformationTestClassproperties @Published,但是当视图模型属性更新时,它们仍然没有更新 View,如下面的 Xcode 调试器所示。

在此处输入图像描述

请查看我的代码,并就如何改进它给我一些建议。

内容视图

设置RestDetailView

定时器文本

视图模型

0 投票
1 回答
34 浏览

ios - 如何在 Swiftui(iOS 15 / Xcode 13.2.1)的 AppDelegate 中使用我的@EnvironmentObject?

我有一堂课:

我将它从 main 声明为 environmentObject :

这门课在我的应用程序中效果很好。现在我需要从 AppDelegate 修改它,因为我需要在收到通知时获取 appInfos_M.userTo.id。我尝试了几件事,但没有一个有效。我怎样才能访问它?

在我需要它的所有观点中,我都以这种方式声明并且它工作正常,但在 AppDelegate 中却不行,为什么?:

这是我尝试过的一项无效的测试:

请注意,3 个小点 (...) 用于放置无用代码。

0 投票
1 回答
46 浏览

arrays - Swift/SwiftUI – 将数组传递给另一个视图

我有一个关于 Swift 的问题,我无法理解。我有一个很简单的看法。这是一个列表,您可以在其中写下每个玩家的姓名,一旦您点击返回,名称就会通过onCommit附加到数组playerArray中。到目前为止,这工作正常。

现在我想将此数组中的名称传递给另一个视图。我怎么做?我是否使用@EnvironmentObject,是否将其保存到@AppStorage或者我需要使用/保存到Core Data然后在我需要的视图中获取数据?

在下一个视图中,我想先显示玩家 1 的姓名,然后在他完成游戏后显示玩家 2 的姓名,当他完成游戏后,再显示玩家 3 的姓名,依此类推。当每个人都玩游戏时,我需要所有的名字再次用于记分牌。在写下来的时候,我想我还需要一种方法来将每个玩家的得分与名字绑定。

稍后我还希望有两支球队,每支球队有两名或更多球员。那里的顺序是A队,玩家1;B队,球员1;A队,选手2;B队,玩家2等等。

任何关于如何使这成为可能的提示都会很棒。如果我需要使用 Core Data 来正确执行此操作,那么我将深入研究 Core Data。

谢谢!

https://i.stack.imgur.com/EgJ3p.gif

0 投票
1 回答
20 浏览

swift - 为 UITextView 在背景下临时存储文本和光标位置的推荐方法

我有一个 UITextView 与文本的属性字符串。当我关闭并重新打开视图或后台应用程序并返回时,textView 中的文本会消失。我希望能够暂时保存它,直到用户提交它。推荐的方法是什么?

我首先尝试了 UIPasteboard,但是在应用程序后台运行后我的 textview 表现出时髦时遇到了奇怪的问题,我回来了。文本在那里,但光标位置永远不会更新,并且 UIViewRepresentable 中的 updateUIView 永远不会被调用。

我还可以创建一个环境对象来存储文本和光标位置,直到用户准备好提交。

对正确策略有任何见解吗?

0 投票
2 回答
59 浏览

swift - SwiftUI:绑定从环境对象派生的结构的属性

我的任务管理器应用程序中有两个结构:

然后我有一个类来存储它们:

我将其作为.environmentObject(taskStore).

如果以下任何一项错误(违反不良做法),请纠正我:

在我的TaskView我有:

问题是,在学习 SwiftUI 时,我被告知在制作某些组件时(比如在这种情况下让您更改标签数组的选择器)它应该接受对值/集合的绑定,或者说我想制作任务标题可编辑,我需要绑定到task.title属性,这两个我都做不到,因为(基于我定义和计算的方式task)我无法在task.

我在这里做一些违反最佳实践的事情吗?或者沿着这条路径,我在哪里偏离了在环境对象中存储真实点的正确方式,并使它们在子视图中可编辑。

0 投票
2 回答
29 浏览

json - SwiftUI - 获取远程 JSON 数据中的数据以在应用启动时刷新

我是一个菜鸟(我的代码/模型目前会显示它,所以请放轻松!)。

我正在尝试创建一个食谱风格(cenotes)应用程序。

这样我就可以更新数据,我有一个远程 json 文件,因此用户无需重新安装即可获取更新的数据。

该应用程序成功检索和解析数据(这是一个胜利!),但仅在首次安装时

当它在线更改时,它不会随后刷新数据。我尝试使用 .onAppear 和 .refreshable 均未成功。我需要删除应用程序并重新安装它才能获取更新的数据。

以下是我文件的一些编辑版本:有人可以帮忙吗?我认为我只有一个 @StateObject/@EnvironmentObject 或类似的不正确的东西,但无法发现错误。

Locations.swift

Location.swift - 虚拟机

App.swift - 应用程序打开此选项卡视图

ListView.swift - 第一个选择的选项卡是这个视图 - 这些位置在初始安装后不会更新:

0 投票
1 回答
46 浏览

swiftui - How to initialize `var` that depends on `environmentObject` in SwiftUI View init()?

Is there a more natural way (now that it's 2022) of initializing some internal variables that depend on an @EnvironmentObject (or other @ObservedObject) within a view's init() function?

For example, the following shows what I'm trying to do (commented out) versus what works. Unfortunately the "what works" code is considerably more unwieldly (bulky, repetitive). Instead of just using a diary var I have to sprinkle my code with try? log.readDiary(for: state.now) or wrap it all in a subviews. Wondering what the best practice is.

There's a related post here: Swiftui - How do I initialize an observedObject using an environmentobject as a parameter?, but I'd rather not create internal subviews to accomplish what seems to be a simple initialization. That just seems... wasteful, repetitive, unwieldly. Hoping the API has evolved a bit since then.

0 投票
1 回答
29 浏览

swift - SwiftUI 视图在状态对象值更改时意外关闭

更改状态会自动关闭视图的奇怪行为。

Xcode 13.2.1、MacOS 12.2.1、iPhone 13 模拟器 iOS 15.something。

我在根视图中生成一个对象并使用@environmentObject(...) 将其传递到环境中,通过根视图中的 NavigationView 导航,沿途更新事物(在这种情况下,对象是数据收集器跨多个屏幕的帐户注册信息)。我进入了几个屏幕,whammo,对...的任何更新

...对象导致解雇。它并不一致(意味着哪个屏幕会这样做),但无论它发生在哪个屏幕上,100% 的时间都会发生。

我不认为我的数据收集器对象有什么过分花哨的东西,即使在一个简单的测试视图上,它仍然会发生(粘贴在下面)。

我可以通过不在环境中使用随行对象并将其收集到本地状态或视图模型中来使它不会发生,但我仍然必须在某个时候将它们全部收集到位。如果不使用全局对象或将其持久化,我真的不喜欢任何其他复杂的想法。这应该只是工作。**抓头**

数据收集器对象

(当然不是真实信息)

因数据更改而崩溃或取消的视图。我想知道这是否是一个线程的事情,所以我有和没有调度。行为没有改变。我认为这与 navigationLink 堆栈的深度有关。

根视图实际上很简单(在这个精简的测试中),如下所示:(示例)

根视图 -> 创建@State 对象 (signupInfo = SignupInfo()) -> NavigationView -> 使用 .environmentObject(signupInfo) 链接到下一个视图

在 NavigationView 出现之前,我还尝试在先前的视图中创建状态并将其发送到环境中。没有改变任何东西。

想法……?

^ ^ ^ ^ ^编辑/更新^ ^ ^ ^ ^

有趣的是,当我将东西移到 viewModel 中时,一切正常,正如预期的那样。没有惊喜。但我仍然想要一个通用的地方来删除数据,而无需创建 CoreData 或 UserDefaults 条目。

当我将底层数据收集器对象移动到全局上下文并将其附加到视图模型时,如果我通过视图模型跳跃属性(视图更新视图模型,视图模型更新全局对象),它就会起作用。

但是,如果我只是直接暴露底层数据连接器,它仍然会以这种疯狂怪异的方式关闭视图。

将全局对象挂在应用程序的主视图之外(仅用于测试) public static var signupInfo = SignupInfo()

然后在 viewModel... 导入 Foundation

和视图:导入 SwiftUI

这一切都很棒。

直接暴露数据是行不通的。viewModel:导入 Foundation

视图:导入 SwiftUI

所以,无论他们如何意识到它,直接与我的 SetupInfo 对象交谈对我的(某些)视图来说都是一个问题,但如果我能弄清楚为什么,该死的。