调用嵌入式containerVC方法时未调用父VC委托方法

时间:2018-01-26 10:11:34

标签: ios swift delegates

我有一个父VC,其中嵌入了容器中的子VC。两个VC都符合委托,但只调用子委托方法。如何让两个VC的委托方法响应?我是否遗漏了容器视图的委托模式?提前感谢您的帮助。

中央课程:

public protocol BLEManagerDelegate: class {
   func bLEManagerShowAlert(message: String)
}

public class BLEManager: NSObject {

  static let sharedInstance = BLEManager()
  weak var delegate: BLEManagerDelegate?

   public func postMessage() {
      delegate?.bLEManagerShowAlert(message: message)
   }
}

ParentVC

class HomeVC: ContentViewController, BLEManagerDelegate {

    var bLEManager = BLEManager.sharedInstance 

    override func viewWillAppear(_ animated: Bool) {
        bLEManager.delegate = self
    }

    // delegate methods

    func bLEManagerShowAlert(message: String) {
    // THIS METHOD IS NOT GETTING CALLED
    }
}

嵌入ParentVC的容器视图

class ChildVC: UITableViewController, BLEManagerDelegate {

    var bLEManager = BLEManager.sharedInstance 

    override func viewWillAppear(_ animated: Bool) {
        bLEManager.delegate = self

    // delegate methods

    func bLEManagerShowAlert(message: String) {
    // This method IS getting called
    }
}

2 个答案:

答案 0 :(得分:2)

您的delegate属性一次只能保存对一个对象的引用。只要您的ChildVC将自己设置为代理人,parentVC就不再是代理人。

如果您想通知多个对象,可以使用NotificationCenter

查看

答案 1 :(得分:0)

为什么需要Singleton BLEManager?你在哪里调用postMessage()?如果警报显示在他们自己的视图控制器中,则只需通过协议扩展名为默认警报消息编写默认实现。然后只需在VC中实现自定义消息的方法。如果您想要多个代表,请尝试:http://www.gregread.com/2016/02/23/multicast-delegates-in-swift/