无法通过Swift4回调协议和委托

时间:2018-04-11 08:28:09

标签: ios swift delegates protocols

我对使用协议和委托回叫感到困惑 问题是。我有两个viewcontrollers vcA & vcB  并且vcA有一个tableView,vcB有一个按钮 vcA单击单元格vcB 然后我想点击vcB中的按钮并执行以下两项操作。

1.vcA tableView reloadData.
2.vcB popViewcontroller To vcA.

我无法理解如何解决这个问题 有什么样的教导我吗?
感谢。

5 个答案:

答案 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的委托,则该事件将被忽略。