我对使用协议和委托回叫感到困惑
问题是。我有两个viewcontrollers vcA & vcB
并且vcA
有一个tableView,vcB
有一个按钮
vcA单击单元格vcB
然后我想点击vcB
中的按钮并执行以下两项操作。
1.vcA tableView reloadData.
2.vcB popViewcontroller To vcA.
我无法理解如何解决这个问题
有什么样的教导我吗?
感谢。
答案 0 :(得分:1)
这是委托解决方案,但最好将self.tableView.reloadData()
方法放在viewDidAppear
内,因为当你弹出VcB时它被调用
class VcA: UIViewController ,TableRefresh {
func reloadTable()
{
// reload here
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let des = segue.destination as! VcB
des.delegate = self
}
}
protocol TableRefresh {
func reloadTable()
}
class VcB: UIViewController {
var delegate: TableRefresh?
@IBAction func closeClicked(_ sender: UIButton) {
self.delegate?.reloadTable()
// pop here
}
}
答案 1 :(得分:0)
有多种方法可以做到这一点。
1:将tableView.reloadData()
放入viewDidAppear()
,然后弹出vcB
2:当您按vcB时,您创建了对它的引用,然后在vcB中,您有一个应用于引用的侦听器。像这样:
class viewControllerB: UIViewController {
var reloadTableView: (() -> ())
@objc func buttonPressed() {
reloadTableView()
self.navigationController?.popViewController(animated: true)
}
}
然后:
let vcB = viewControllerB()
vcB.reloadTableView = {
self.tableView.reloadData()
}
present(vcB, animated: true)
3:像Sh_Khan一样
答案 2 :(得分:0)
我希望这对您有用:
class vcA : UIViewController {
override func viewWillAppear(_ animated: Bool) {
tableView.reloadData()
}
}
class vcB : UIViewController {
@IBAction fun button(bin : UIButton){
self.navigationController.popViewController(true)
}
}
答案 3 :(得分:0)
如果任何VC对象的方法不在您的记忆中,则无法调用它们。
第一次,vcB不会在内存中。因此,它的目的不存在。
如果你真的想要调用该类的函数,并且如果它的可行包装是vcB的对象并调用该方法。 或者您可以尝试VC的共享对象,并在可行的情况下继续使用它。你可以发布确切的场景,以便人们可以提出更好的建议
答案 4 :(得分:0)
您的vcA
引用了vcB
,因此您可以在vcA中编写类似的内容
class vcA {
var vcB: vcB?
...
vcB?.doSmth()
....
}
但是您无法从vcA
拨打vcB
,因为它没有引用它。因此,要让vcA
知道vcB
中发生了某些事情,或者从vcB
调用某个函数,您可以做几件事。
代表,键值观察,反应式编程等。
既然你要求代表解决方案让我们坚持下去。
代表背后的一般想法就是这个名字告诉delegate
其他人做某事。在您的情况下,您希望将按钮单击处理委派给vcA
。要做到这一点,你需要做一些事情。
接下来的步骤只是实现上述想法。
class VcA {
var vcB: VcB?
...
vcB?.delegate = self
...
vcB?.doSmth()
....
}
extension VcA: VcBDelegate {
func buttonIsClicked() {
// reload data
// pop vcB
}
}
protocol VcBDelegate: class {
func buttonIsClicked()
}
class VcB {
var delegate: VcBDelegate?
...
// when the button is clicked
// delegate handling to someone who is 'listening' for this event
self.delegate?.buttonIsClicked()
...
}
注意VcB中的delegate
是如何可选的,这意味着如果没有人被签名为VcB的委托,则该事件将被忽略。