如何在更新容器 B 后重新加载容器 A?

How to reload Container A after update Container B?

我有一个 ViewController 包含 3 个 ContainerView 的分段控件。每个容器都是一个包含 table 视图的 ViewController。在 CV2 中,我可以选择一行。此行已从 CV2 中删除,应添加到 CV1 中。

在使用 Segmented Controller 之前,我使用了选项卡,table 每个选项卡上的视图都已正确更新。现在,有了 ContainerView,我不知道如何调用重新加载。这是我对段的操作:

@IBAction func bSegment(_ sender: UISegmentedControl) {
        if sender.selectedSegmentIndex == 0 {
        UIView.animate(withDuration: 0.0, animations: {
            self.listBOutlet.alpha = 1
            self.addBOutlet.alpha = 0
            self.delBOutlet.alpha = 0
        })
    } else {
        if sender.selectedSegmentIndex == 1 {
        UIView.animate(withDuration: 0.0, animations: {
            self.listBOutlet.alpha = 0
            self.addBOutlet.alpha = 1
            self.delBOutlet.alpha = 0
        })
        } else {
            if sender.selectedSegmentIndex == 2 {
            UIView.animate(withDuration: 0.0, animations: {
                self.listBOutlet.alpha = 0
                self.addBOutlet.alpha = 0
                self.delBOutlet.alpha = 1
                })
            }
        }
    }
}

我尝试了很多类似的方法来访问 CV2 中的 viewWillAppear :

            print(self.children)
            var myClass : ListeBEtb = self.????
            myClass.ListeB.reloadData()
            myClass.viewWillAppear(false)

但是不知道怎么调用ListeBEtb(CV1)来更新

在我的 CV2 中:

override func viewWillAppear(_ animated: Bool) {

    let recupListeBAddModel = RecupListeBAddModel()

    recupListeBAddModel.delegate = self

    recupListeBAddModel.downloadItems(id: idEtablissement)
    self.ListeB.reloadData()
}

你知道吗?

谢谢

您可以通过多种方式完成这项工作,最简单的方式是使用通知中心作为开始。

委托模式是另一种,RxSwift也是一种替代,等等

为了使用通知中心,首先,定义一个扩展以便于通知处理:

extension Notification.Name {
    static let rowDeleted = Notification.Name("rowDeleted")
}

之后,订阅CV1中新建的通知:

NotificationCenter.default.addObserver(self, selector: #selector(rowDeleted), name: .rowDeleted, object: nil)

请注意,您需要在 CV1 中使用一个名为 rowDeleted 的方法,或者您希望如何调用它。

此外,请确保在 CV1 的 deinit 中删除自己作为观察者的身份:

deinit { 
  NotificationCenter.default.removeObserver(self)
}

然后,当您在 CV2 中进行更新时,使用如下内容:

NotificationCenter.default.post(name: .rowDeleted, object: nil)

这一切都是假设您不需要传递实际对象,而只需要一个事件通知。对象传递有点不同,使用委托模式可以做得更好,但这是一个不错的开始。

如果您尝试调用 viewWillAppear(_:) 函数中存在的某些逻辑,为什么不将其提取到它自己的函数中,从 viewWillAppear(_:) 调用新函数,然后您可以调用当您转换容器视图时,该功能再次起作用。

所以在您的容器视图中,它现在看起来像这样。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    reloadDataModel()
}

func reloadDataModel() {
    let recupListeBAddModel = RecupListeBAddModel()

    recupListeBAddModel.delegate = self

    recupListeBAddModel.downloadItems(id: idEtablissement)
    self.ListeB.reloadData()
}

然后,在你的转换代码中,也许就在你的动画代码之前,你可以调用 listBOutlet.reloadDataModel(),这样它就可以在动画进行时进行操作。