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

问题描述 投票:1回答:2

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

在使用分段控制器之前,我已经正确使用了选项卡和每个选项卡上的表视图。现在,使用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()
}

你有什么想法吗?

谢谢

swift cocoa-touch
2个回答
0
投票

您有两种方法可以完成这项工作,最简单的方法是使用通知中心进行启动。

其他是委托模式,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)

这全部是假设您不需要传递实际的对象,而只需要一个事件通知。对象传递有些不同,使用委托模式可以更好地完成传递,但这是一个不错的开始。


0
投票

[如果要尝试调用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(),因此它可以在动画进行时进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.