Swift делегат и протоколы - PullRequest
       24

Swift делегат и протоколы

0 голосов
/ 06 августа 2020

Для работы протоколов и делегатов, должны ли контроллеры представления быть смежными в стеке? Функция, вызванная моим делегатом, работала нормально, пока я не вставил новый v c между v c, отправляющим данные, и v c, принимающим их. (Если ответ будет: «Конечно, идиот!», Я бы действительно почувствовал облегчение, так как я действительно в тупике.)

1 Ответ

1 голос
/ 06 августа 2020

Предположительно у вас что-то вроде этого:

enter image description here

and your code runs along these lines:

protocol MyCustomDelegate: class {
    func myFunc(_ value: Int)
}

class VC1: UIViewController, MyCustomDelegate {
    
    func myFunc(_ value: Int) {
        print("value: \(value)")
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? VC2 {
            vc.delegate = self
        }
    }
}

class VC2: UIViewController {
    
    weak var delegate: MyCustomDelegate?
    
    func someAction(_ sender: Any?) -> Void {
        delegate?.myFunc(1)
    }
    
}

Now, you "insert a new VC":

введите описание изображения здесь

Итак, ваш код в VC1 больше не переходит на VC2 ... и, таким образом, делегат не будет установлен.

Один подход, не обязательно лучший , будет:

  • добавить переменную делегата в VC1A, которая установлена ​​VC1
  • при переходе от VC1A к VC2, передать этот делегат вместе

Это может выглядеть примерно так:

protocol MyCustomDelegate: class {
    func myFunc(_ value: Int)
}

class VC1: UIViewController, MyCustomDelegate {
    
    func myFunc(_ value: Int) {
        print("value: \(value)")
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? VC1A {
            vc.delegate = self
        }
    }

}

class VC1A: UIViewController {
    
    weak var delegate: MyCustomDelegate?
    
    func someAction(_ sender: Any?) -> Void {
        delegate?.myFunc(1)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? VC1A {
            vc.delegate = self.delegate
        }
    }

}

class VC2: UIViewController {
    
    weak var delegate: MyCustomDelegate?
    
    func someAction(_ sender: Any?) -> Void {
        delegate?.myFunc(1)
    }
    
}

Если поток вашего приложения достаточно прост, это, вероятно, сработает ... но это не идеально и подвержено проблемам по мере того, как ваш код становится более сложным.

Возможно, вы захотите переосмыслить структуру вашего кода и то, как вы пытаетесь управлять своими данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...