Свифт-делегат никогда не вызывается - PullRequest
1 голос
/ 15 апреля 2020

Я знаю, что вопрос уже есть на форуме, но я не знаю, почему мой делегат не работает. Кстати, я работаю с ними впервые.

Вот код

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

}

ContainerView:

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

Что я пытаюсь сделать: когда я прокручиваю, я хочу отправить bool на мой ViewController. Когда bool == true, я хочу что-то, а когда bool == false, я хочу сделать что-то еще.

Я надеюсь, что кто-то может мне помочь:)

Ответы [ 2 ]

4 голосов
/ 15 апреля 2020

вместо этого:

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
    }
}
1 голос
/ 15 апреля 2020

Вы выделяете ContainerViewController, который освобождается примерно через микросекунду, когда код покидает viewDidLoad, потому что на него нет ссылок.

...