Swift 永远不会调用委托

Swift Delegate is never called

我知道问题已经在论坛中了,但我不知道为什么我的委托不起作用。顺便说一句,我是第一次和他们一起工作。

这是代码

ViewController:

class ViewController: UIViewController, ContainerViewControllerDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()

        let controller = ContainerViewController()
        controller.containerDelegate = self

    }

    func didScrollChangeAppearanceBarButtonItem(change: Bool) {
        if(change == true){
            print("true")
        }else{
            print("false")
        }
    }

}

容器视图:

protocol ContainerViewControllerDelegate {
     func didScrollChangeAppearanceBarButtonItem(change: Bool)
}

class ContainerViewController: UIViewController, UIScrollViewDelegate{

    var containerDelegate: ContainerViewControllerDelegate?

    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

        if(velocity.y>0) {
            containerDelegate?.didScrollChangeAppearanceBarButtonItem(change: false)
            print("1")

        } else {
            containerDelegate?.didScrollChangeAppearanceBarButtonItem(change: true)
            print("2")
        }
    }
}

我想做什么:当我滚动时,我想向我的 ViewController 发送一个布尔值。当 bool == true 时我想做一些事情,当 bool == false 我想做其他事情。

我希望有人能帮助我:)

您正在分配一个 ContainerViewController,它在代码离开 viewDidLoad 后大约一微秒后被释放,因为没有对它的引用。

而不是这个:

let controller = ContainerViewController() 
controller.containerDelegate = self 

在 viewDidLoad() 之外创建变量:

var controller:ContainerViewController! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    controller = ContainerViewController() 
    controller.containerDelegate = self 
}

原因是一旦 viewDidLoad 函数结束,在 viewDidLoad 中初始化的控制器就会被释放

编辑

我会详细说明,如果你试图通过 segue 访问你的其他视图控制器,这是错误的方式。而是这样做:

self.performSegueWithIdentifier("your identifier", sender: self)

然后添加一个功能:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "Your identifier") {
        guard let controller = segue.destination as? ContainerViewController else { return }
        controller.delegate = self
    }
}