我有一个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()
}
您对此有任何想法吗?
谢谢
答案 0 :(得分: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
的方法,或者您想调用它。
此外,请确保在de
deinit {
NotificationCenter.default.removeObserver(self)
}
然后,当您在CV2中进行更新时,请使用以下内容:
NotificationCenter.default.post(name: .rowDeleted, object: nil)
所有这些都假设您不需要传递实际的对象,而只需要一个事件通知。对象传递有些不同,使用委托模式可以更好地完成传递,但这是一个不错的开始。
答案 1 :(得分: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()
,以便它可以在动画进行时进行操作。