Swift无法从父级更新视图

奎因

因此,我有一个SwiftUI视图,该视图在父ViewControllersviewDidLoad()方法中实例化

看起来像这样:

class ChildViewController: UIViewController {
    private var historyView: HistoryView?
    private var models: [HistoryModel]?
    ...

    override func viewDidLoad() {
        super.viewDidLoad()

        historyView = HistoryView(models: models)
        let historyViewHost = UIHostingController(rootView: historyView)
        view.addSubview(historyViewHost.view)
        historyViewHost.didMove(toParent: self)
        historyViewHost.view.frame = view.frame
    }
    ...
}

在某个时候,我需要更新historyView中的模型,并且这样做:

func updateHistory() {
    let updatedModels = requests.map({ HistoryModel.fromRequest(request: $0) })

    historyView!.historyCellModels = updatedModels
}

问题是视图中的模型实际上没有得到更新。我并不是说视图不会显示新模型,但实际上它甚至都无法获得新模型列表。

每当单击按钮时,我的HistoryView也会更新,当我单击该按钮时,我在视图的构造中设置了一个断点,并且从调试器中可以看到模型没有更新。我的方法中也有一个断点updateHistory,在那里我可以看到父对象中的模型已更新,只是没有传递给孩子。

我的想法是可能正在创建视图的2个实例,而我只是在更新错误的一个。因此,historyView当我在内部有一个断点时,便查看了它的内存,并写下了它在内存中的位置。然后在父视图中的断点处,我去查看内存,historyView它指向0x00!但是,甚至更陌生的是那historyView不是零!我什至对它进行了强制转换,该程序没有问题。

因此,我认为调试器必须在骗我,只是没有提供正确的信息。所以我去了一些旧的可信赖的印刷声明。当我添加如下打印语句时:

    func updateHistory() {
        let updatedModels = requests.map({ HistoryCellModel.fromRequest(request: $0) })

        print(updatedModels.count)
        historyView!.historyCellModels = updatedModels
        print(historyView?.historyCellModels.count)
    }

然后创建一个新模型,并调用它将输出的更新函数:

11
Optional(10)

那怎么可能!

我的HistoryView看起来像这样:

struct HistoryView: View {
    @State var historyCellModels: [HistoryModel]

    var body: some View {
        List(historyCellModels) { ... }    
    }
}

我清楚地将两个变量设置为相等,视图为非null,只有一个实例...我真的不确定下一步要解决的错误是什么。有什么明显的我可能会丢失的东西吗?

他的脾气

@State设计在SwiftUI视图本身内使用(建议始终声明为私有)。

所以这是一种方法

改用

struct HistoryView: View {
    @ObservedObject var historyCellModels: HistoryViewModel

    init(models: HistoryViewModel) {
       historyCellModels = models
    }
    ...

哪里

import Combine

class HistoryViewModel: ObservableObject {
    @Published var historyCellModels: [HistoryModel]
}

现在可以

class ChildViewController: UIViewController {
    private var models: HistoryViewModel = HistoryViewModel()
    ...

func updateHistory() {
    let updatedModels = requests.map({ HistoryModel.fromRequest(request: $0) })

    models.historyCellModels = updatedModels
}

所有应该工作。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CakePHP从父级更新子级模型

来自分类Dev

Android从父级销毁当前视图

来自分类Dev

如何从父级视图调用子级View方法?

来自分类Dev

如何从父级更新vuejs组件

来自分类Dev

无法从 Angular 2 的父级更新子组件视图

来自分类Dev

无法从父包python导入子级

来自分类Dev

无法从父级继承表格属性

来自分类Dev

无法从父级中的@viewchildren 调用方法

来自分类Dev

如何从父视图快速访问容器视图子级

来自分类Dev

无法从父级访问功能-从父级向子级发送道具

来自分类Dev

在Angular中从父级更新子级组件

来自分类Dev

避免从父级updatepanel刷新子级更新面板

来自分类Dev

iOS Swift-从父级访问子级中的方法

来自分类Dev

C ++无法从父级访问子级属性

来自分类Dev

C ++工厂。无法从父级访问子级构造函数

来自分类Dev

无法从父视图调用Fragment的方法

来自分类Dev

如何从父级活动中更新片段内的数据

来自分类Dev

Ag-Grid从父级更新行数据

来自分类Dev

ReactJS从父级的onClick方法更新对子组件的ajax调用

来自分类Dev

会话未锁定时无法从父级删除

来自分类Dev

在Swift中,自定义视图的drawRect无法正确更新

来自分类Dev

在Swift中,自定义视图的drawRect无法正确更新

来自分类Dev

我该如何更新通过prop从父级发送的子级组件中的数据

来自分类Dev

如何从父级到子级获取更新的数据作为道具

来自分类Dev

无法更新列表视图

来自分类Dev

有什么方法可以在 swift/SpriteKit 中从父级中删除单个/特定子级?

来自分类Dev

Bootstrap Grid System无法在Angular组件中从父级到子级通信

来自分类Dev

视图无法锚定到父级CoordinatorLayout

来自分类Dev

无法将道具从父级传递到子级并将其保存在子级组件的状态下

Related 相关文章

  1. 1

    CakePHP从父级更新子级模型

  2. 2

    Android从父级销毁当前视图

  3. 3

    如何从父级视图调用子级View方法?

  4. 4

    如何从父级更新vuejs组件

  5. 5

    无法从 Angular 2 的父级更新子组件视图

  6. 6

    无法从父包python导入子级

  7. 7

    无法从父级继承表格属性

  8. 8

    无法从父级中的@viewchildren 调用方法

  9. 9

    如何从父视图快速访问容器视图子级

  10. 10

    无法从父级访问功能-从父级向子级发送道具

  11. 11

    在Angular中从父级更新子级组件

  12. 12

    避免从父级updatepanel刷新子级更新面板

  13. 13

    iOS Swift-从父级访问子级中的方法

  14. 14

    C ++无法从父级访问子级属性

  15. 15

    C ++工厂。无法从父级访问子级构造函数

  16. 16

    无法从父视图调用Fragment的方法

  17. 17

    如何从父级活动中更新片段内的数据

  18. 18

    Ag-Grid从父级更新行数据

  19. 19

    ReactJS从父级的onClick方法更新对子组件的ajax调用

  20. 20

    会话未锁定时无法从父级删除

  21. 21

    在Swift中,自定义视图的drawRect无法正确更新

  22. 22

    在Swift中,自定义视图的drawRect无法正确更新

  23. 23

    我该如何更新通过prop从父级发送的子级组件中的数据

  24. 24

    如何从父级到子级获取更新的数据作为道具

  25. 25

    无法更新列表视图

  26. 26

    有什么方法可以在 swift/SpriteKit 中从父级中删除单个/特定子级?

  27. 27

    Bootstrap Grid System无法在Angular组件中从父级到子级通信

  28. 28

    视图无法锚定到父级CoordinatorLayout

  29. 29

    无法将道具从父级传递到子级并将其保存在子级组件的状态下

热门标签

归档