当将具有不同值的相同类对象作为数据源传递时,为什么不重新渲染视图

拉斯·斯特格曼

我正在探索SwiftUI,但遇到了一些我无法弄清楚的事情。

我已经创建了一个可以取如上述上出现数据的容器视图柱,但不是完全地改变呈现视图引用的对象,我只加载它的一些属性。

加载程序是ObservableObject容器视图所观察到的。当加载器指示其值已更改时,容器视图将重新加载其body属性,并显示带有新数据的渲染视图。但是,当需要加载的对象是一个类时,并非该body属性中的所有子视图都会重新加载。

这是我的实现的一些“伪”代码。

protocol ValueLoader: Combine.ObservableObject {
    associatedtype Value

    var data: Value { get set }
    func load()
}

struct ValueLoadingContainerView<ValueConsumer: View, 
                                 ValueContainer: ValueLoader>: View {
    @ObservedObject var valueLoader: ValueContainer
    let containedView: (ValueContainer.Value) -> ValueConsumer

    init(_ loader: ValueContainer, 
         @ViewBuilder contained: @escaping (ValueContainer.Value) -> ValueConsumer) {
        self.valueLoader = loader
        self.containedView = contained
    }

    var body: some View {
        containedView(valueLoader.data)
            .onAppear(perform: load)
    }

    private func load() {
        self.valueLoader.load()
    }
}
class Object {
    let id: String
    var title: String?

    func load(from ...) {
        self.title = ...
    }
}
struct ConcreteLoader: ValueLoader {
    @Published var data: Object

    func load() {
        guard shouldLoad() else { return }  // To prevent infinite recursion
        ...
        // self.objectWillChange is synthesised by conforming to 
        // ObservableObject and having a property with @Published
        self.objectWillChange.send()          
        self.data.load(from: ...)
    }
}

struct ObjectRenderingView: View {
    let object: Object

    var body: some View {
        Text(object.title ?? "ObjectRenderingView is waiting...")
    }
}
let object = Object(id: "1", title: nil)

ValueLoadingContainer(ConcreteLoader(object), 
                      contained: { obj in
                          Text(obj.title ?? "Text is waiting...")     // 1
                          Divider()
                          ObjectRenderingView(object: obj)   // 2
                      })

加载程序加载后,其属性将再次用该对象object调用传递的@ViewBuilder闭包,但是现在加载了其属性。

如果添加print语句,则可以清楚地看到该contained @ViewBuilder闭包被调用了两次:一次是使用卸载对象,一次是使用加载对象。这些是相同的对象,但是第二次,属性已加载。

Text标签(1)正确更新,更改“文本在等待......”的实际标题,但ObjectRenderingView(2)不更新其子视图。

initObjectRenderingView被称为新数据,但绝不会在访问的身体属性。这向我表明SwiftUI认为数据没有更改,因此不需要重新呈现。

我想我知道为什么它不起作用:的身份obj没有更改,因此SwiftUI认为ObjectRenderingView不需要重新加载。由于值的标识obj.title已从更改nil为实际标题,因此Text将重新加载视图。我不知道的是如何使SwiftUI也重新加载ObjectRenderingView

谢谢!

方法

它应该是一个值类型。请查看Xcode中ObservedObject的文档。

如果Value不是值语义,Binding则未指定使用结果的任何视图的更新行为

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么具有分离数据源的不同持久性单元查询同一数据源?

来自分类Dev

具有视图类型数据源的子报表在传递参数时返回空

来自分类Dev

将多个值从具有相同类的选择元素传递给 Django 视图

来自分类Dev

当对象值具有不同类型时,通过多个查询参数过滤数据

来自分类Dev

从表中重新加载数据时,UITable视图数据源和委托的顺序是什么?

来自分类Dev

为什么订阅相同序列的不同可观察对象时,ReplySubject具有不同的行为?

来自分类Java

将基本类型对象的列表作为子报表的数据源传递

来自分类Dev

来自不同数据源的具有相同表名的CakePHP 3烘焙模型

来自分类Dev

如何使用具有不同数据源链接的相同发布的 PowerBI 报告?

来自分类Dev

确定来自SQL数据源的数据是否具有相同的值

来自分类Dev

将具有不同类型且继承相同类的对象存储在容器中

来自分类Dev

当我传递不同的对象时,为什么AJAX会将相同的数据返回给回调?

来自分类Dev

领域作为Tableview的数据源-如何在数据源中存储不同的对象

来自分类Dev

具有不同卡和不同数据源的Recyclerview

来自分类Dev

c ++将数据源功能作为参数传递

来自分类Dev

为什么将numpy.nan作为值传递时numpy.isin()的行为不同?

来自分类Dev

为什么重新分配对象具有不同的值?

来自分类Dev

id()的含义以及为什么与Process fork不同的对象具有相同的id()值?

来自分类Dev

Scala:具有相同类的对象具有不同的类型?

来自分类Java

为什么要使用JNDI作为数据源

来自分类Dev

为什么查询中的数据源处理与表单中的数据源处理不同?

来自分类Dev

具有多种视图类型和数据源的RecyclerView

来自分类Dev

为什么具有相同元素的HashSet在调用GetHashCode()时返回不同的值?

来自分类Dev

Javascript:当对象拥有函数时,为什么在apply方法中将相同的对象作为参数传递?

来自分类Dev

为什么javascript“ for循环”针对不同类型的对象具有不同的行为

来自分类Dev

当基础数据源具有新值时,了解可观察到的RxJava

来自分类Dev

为什么这些具有完全相同类的按钮宽度不同?

来自分类Dev

相同类型/类的对象是否可能具有不同的数据属性?

来自分类Dev

在创建具有不同数据的Bean列表时,将相同数据应用于相同类型的所有Bean

Related 相关文章

  1. 1

    为什么具有分离数据源的不同持久性单元查询同一数据源?

  2. 2

    具有视图类型数据源的子报表在传递参数时返回空

  3. 3

    将多个值从具有相同类的选择元素传递给 Django 视图

  4. 4

    当对象值具有不同类型时,通过多个查询参数过滤数据

  5. 5

    从表中重新加载数据时,UITable视图数据源和委托的顺序是什么?

  6. 6

    为什么订阅相同序列的不同可观察对象时,ReplySubject具有不同的行为?

  7. 7

    将基本类型对象的列表作为子报表的数据源传递

  8. 8

    来自不同数据源的具有相同表名的CakePHP 3烘焙模型

  9. 9

    如何使用具有不同数据源链接的相同发布的 PowerBI 报告?

  10. 10

    确定来自SQL数据源的数据是否具有相同的值

  11. 11

    将具有不同类型且继承相同类的对象存储在容器中

  12. 12

    当我传递不同的对象时,为什么AJAX会将相同的数据返回给回调?

  13. 13

    领域作为Tableview的数据源-如何在数据源中存储不同的对象

  14. 14

    具有不同卡和不同数据源的Recyclerview

  15. 15

    c ++将数据源功能作为参数传递

  16. 16

    为什么将numpy.nan作为值传递时numpy.isin()的行为不同?

  17. 17

    为什么重新分配对象具有不同的值?

  18. 18

    id()的含义以及为什么与Process fork不同的对象具有相同的id()值?

  19. 19

    Scala:具有相同类的对象具有不同的类型?

  20. 20

    为什么要使用JNDI作为数据源

  21. 21

    为什么查询中的数据源处理与表单中的数据源处理不同?

  22. 22

    具有多种视图类型和数据源的RecyclerView

  23. 23

    为什么具有相同元素的HashSet在调用GetHashCode()时返回不同的值?

  24. 24

    Javascript:当对象拥有函数时,为什么在apply方法中将相同的对象作为参数传递?

  25. 25

    为什么javascript“ for循环”针对不同类型的对象具有不同的行为

  26. 26

    当基础数据源具有新值时,了解可观察到的RxJava

  27. 27

    为什么这些具有完全相同类的按钮宽度不同?

  28. 28

    相同类型/类的对象是否可能具有不同的数据属性?

  29. 29

    在创建具有不同数据的Bean列表时,将相同数据应用于相同类型的所有Bean

热门标签

归档