Swift Delegate никогда не вызывается

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

Вот код

Вьюконтроллер:

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

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

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


person Lukas    schedule 15.04.2020    source источник
comment
Если вы используете раскадровку, ContainerViewController() не является экземпляром в раскадровке. Вам нужна реальная ссылка по переходу или созданию экземпляра.   -  person vadian    schedule 15.04.2020
comment
print("1") и print("2") вызываются? В таком случае containerDelegate равно нулю? Не могли бы вы сделать let controller = ContainerViewController() переменной экземпляра? Может быть проблема масштаба. Что такое controller?   -  person Larme    schedule 15.04.2020
comment
@Larme 1. Вызывается печать («1») и печать («2»). Где я должен доказать, что containerDelegate = nil? После того, как я напечатаю («1»)? 2. Извините, что такое экземпляр var? 3. контроллер должен быть таким же, как ContainerViewController()   -  person Lukas    schedule 15.04.2020
comment
@Larme Да, containerDelegate равен нулю. Как я могу это исправить?   -  person Lukas    schedule 16.04.2020
comment
Конечно, это nil, потому что это не тот экземпляр. Как я уже сказал, экземпляр в раскадровке и controller — это два совершенно разных объекта.   -  person vadian    schedule 16.04.2020
comment
@vadian Ты был прав. Как я могу получить доступ к своему ContainerView?   -  person Lukas    schedule 16.04.2020
comment
Пожалуйста, перечитайте мой первый комментарий. Вам нужна реальная ссылка путем перехода или создания экземпляра.   -  person vadian    schedule 16.04.2020
comment
@ Большое спасибо, Вадиан. Я думаю, что теперь я сделал это правильно, но мой controllerDelegate все еще равен нулю. Вот мой код: let storyboard = UIStoryboard(name: "Main", bundle: nil); let controller = storyboard.instantiateViewController(withIdentifier: "ContainerViewController") as! ContainerViewController; controller.containerDelegate = self   -  person Lukas    schedule 16.04.2020


Ответы (2)


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

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
    }
}
person Ali    schedule 15.04.2020
comment
Я изменил свой код, но он все еще не работает. Любые другие идеи? - person Lukas; 16.04.2020
comment
Когда я создаю функцию, я получаю сообщение об ошибке: Метод не переопределяет какой-либо метод из своего суперкласса. - person Lukas; 16.04.2020

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

person gnasher729    schedule 15.04.2020