问题标签 [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 回答
143 浏览

swiftui - SwiftUI:使用切换删除单元格时索引超出范围

我在删除包含切换的单元格时遇到问题。

我的模型如下所示:

我的观点是:

如您所见,我使用@EnvironmentObject. 每次我尝试删除单元格时,都会收到以下错误消息AppDelegate

我认为问题在于我如何将数据从 myContentView()传递到ItemCell(). 我还尝试将代码集成ItemCell()到闭包中,ForEach但这不起作用。

希望可以有人帮帮我。

附加问题:使用 EnvironmentObject ( ) 注入的目的是什么.environmentObject(self.model)?我不明白什么时候使用它,什么时候不使用它。据我了解,EnvironmentObject 是一个全局对象,它存在于环境中,并且始终更新信息,独立于视图。

谢谢!尼科

更新:

我有另一个想法,但也没有用 ContentView::

ItemCell

有任何想法吗?

更新 2

这也不起作用:

0 投票
1 回答
567 浏览

swift - SwiftUI 在presentationMode?.wrappedValue.dismiss() 上随机崩溃

这就是崩溃的样子

在此处输入图像描述

所以它在 UIKit 线上随机崩溃

我在默认的 SwiftUI 导航堆栈中有视图:

所以我以这种方式将 MyView 推送到导航堆栈中:

然后在用户在几秒钟后按下 MyView 中的按钮后,我调用hide()MyViewModel。几乎所有时间它都在工作,但在 5-10% 的情况下它会崩溃。

0 投票
1 回答
317 浏览

ios - 你如何在一个类中进行双向绑定?

使用 @EnvironmentObject 我创建了一个继承自 ObservableObject 的类,它是 @Published 全局变量的中心。不过,我无法从类中创建双向绑定。我怎样才能做到这一点?$ 在类中不起作用,因为它只适用于@State,而@State 在类中不起作用。我需要双向绑定,因为当用户在屏幕上移动子实例时,每个子实例都必须具有屏幕位置的实时数据变化。这是我的代码:

0 投票
1 回答
67 浏览

view - SwiftUI - ObservableObject、EnvironmentObject、SummaryView

创建代码后,我想创建一个摘要视图,允许我查看在选择器中选择的值。我能怎么做?我阅读了一些关于@ObservableObject 和@EnvironmentObject 的论坛,但我无法理解......非常感谢:)

0 投票
1 回答
140 浏览

swift - SwiftUI 使用 EnvironmentObject 订阅属性更改

这是我的模型:

我有一个链接到 ChannelStore 的 EnvironmentObject ,它都按预期工作。

问题是当属性 thumbnailImage 更改时我的视图需要更新。(由于它来自网络调用,因此视图在调用返回之前生成,同时使用库存图像)。我尝试将 Published 属性包装器添加到该属性,但它没有做任何事情。

在我看来,我有:@EnvironmentObject var channelStore: ChannelStore

如何订阅由 EnvironmentObject 管理的属性更改?

编辑

建议将 Channel 类更改为结构。我上课的唯一原因是避免“不能分配给属性:'channel'是'let'常量:

最后的评论

通过使用下面提供的答案并将我的 for 循环更改为以下内容,我能够解决整个问题:

0 投票
1 回答
286 浏览

swift - SwiftUI NavigationLink @Binding 数组元素导致致命错误:索引超出范围

我有一个可观察的对象,这是我独特的事实来源:

这是车:

这里擦除和添加(编辑列表的功能)工作,一切正常:

问题在这里:

如果我单击擦除按钮,主列表将变为一个空数组。但是应用程序崩溃了,我收到了这个错误:

致命错误:索引超出范围:文件 /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.2.25.8/swift/stdlib/public/core/ContiguousArrayBuffer.swift,第 444 行

问题是 :

  1. 为什么 ?
  2. 如何解决?

此致

0 投票
1 回答
2158 浏览

swift - SwiftUI - 从 Swift 类启动的可观察对象不会更新 ContentView() 上的 @ObservedObject

ObservableObject 类是从 ContentView() 和另一个 Swift 类中实例化的。当 Swift 类运行 ObservableObject 类的函数时,它不会更新 ContentView() 的 @ObservedObject。

我知道这是因为我两次实例化 ObservableObject 类。当 ContentView() 不能/不能实例化 Observable 类时,使用 @ObservedObject 的最佳做法是什么?

我还没有找到让 @EnvironmentObject 与 Swift 类一起工作的方法。
我可以使用全局变量并运行 Timer() 来检查对它的更改。但是,这感觉像是一种丑陋的做法?!?

请参阅下面的示例代码。请在设备上运行,以查看打印语句。

编辑:我想我的问题是当我无法从 SwiftUI 视图实例化 Swift 类时,如何从 Swift 类获取数据并更新 SwiftUI 视图。

0 投票
1 回答
2495 浏览

swiftui - @EnvironmentObject 和 @ObservedObject 有什么区别?

我一直在阅读 SwiftUI 中的属性包装器,我发现它们做得很好,但我真正不明白的一件事是@EnvironmentObject@ObservedObject之间的区别。

从我目前学到的知识来看,当我们在应用程序的各个地方都需要一个对象但我们不需要将它传递给所有这些对象时,我看到使用@EnvironmentObject 。例如,如果我们有层次结构 A -> B -> C -> D 并且对象是在 A 处创建的,它会保存在环境中,以便我们可以将它直接从 A 传递给 D,如果 D 需要它。

如果我们使用在 A 处创建并需要传递给 D 的@ObservedObject ,那么我们也需要经过 B 和 C。

但我仍然不知道如何决定使用哪一个。以下是我制作的 2 个示例项目:

两个代码都对视图进行相同的更新。两个 ContentView 也都传递一个Order对象。不同之处在于 Environment 传递 .environmentObject(order)而 Observed 直接传递EditView(order: order)。对我来说,两者都做同样的工作,只是他们的声明不同,因此我希望得到一些解释或更好的例子。

0 投票
1 回答
665 浏览

swiftui - SwiftUI 如何将全局变量传递给非视图类

我了解如何使用 @EnvironmentObject 使全局数据可用于任何视图类,但我找不到将变量传递给非视图类的方法。

我的情况,这似乎是一个常见的问题,是:

  1. 登录,返回访问令牌。在所有后续的 api 调用中都需要使用此令牌
  2. 将访问令牌存储在 UserSettings 类中
  3. 将 UserSettings 放在 Environment 存储桶中
  1. 每个视图将根据 api 调用中返回的数据显示数据
  1. Categories() 是一个非视图 Swift 类,它将检索数据,但需要存储在 UserSettings 中的访问令牌

UserSettings 是空的,因为该类不是 View 结构,并且其行为似乎不像 View 类。由于我需要的访问令牌存储在 UserSettings 类中,我如何才能访问它?是否有另一种方法来存储/访问这些数据?

0 投票
1 回答
108 浏览

class - SwiftUI: EnvironmentObject loads only the first time

in my current project I work with an EnvironmentObject but I have a very strange bug, maybe someone can help.

First the code:

Model:

First View:

Second View (TraingsView):

NOW THE PROBLEM: When I start the app, set the different times, go to the TrainingsView, everything works fine. Then I go back to the first View(change the times or not, it doesn't matter) and go back to the TraingsView. Now nothing works! It doesn't find the EnvironmentObject anymore. I don't know why because the first time it did. Does somebody know why?

(An other problem I is, that print() doesn't work. I can't see the things that should print out. I don't know if that is important...)

Thanks in advance!