Swift 委托从未被调用

Luk*_*kas 1 delegates protocols ios uicontainerview swift

我知道这个问题已经在论坛中存在,但我不知道为什么我的代表不起作用。顺便说一下,我是第一次和他们一起工作。

这是代码

视图控制器:

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")
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

容器视图:

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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做的事情:当我滚动时,我想向我的 ViewController 发送一个布尔值。当 bool == true 时我想做某事,当 bool == false 时我想做别的事。

我希望有人能帮助我:)

Ali*_*ahr 5

而不是这个:

let controller = ContainerViewController() 
controller.containerDelegate = self 
Run Code Online (Sandbox Code Playgroud)

在 viewDidLoad() 外部创建变量:

var controller:ContainerViewController! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    controller = ContainerViewController() 
    controller.containerDelegate = self 
}
Run Code Online (Sandbox Code Playgroud)

原因是,一旦 viewDidLoad 函数到达末尾,在 viewDidLoad 内初始化的控制器就会被释放。

编辑

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

self.performSegueWithIdentifier("your identifier", sender: self)
Run Code Online (Sandbox Code Playgroud)

然后添加一个函数:

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
    }
}
Run Code Online (Sandbox Code Playgroud)