Не работает prepare for seque


#1

Пытаюсь изменить label из другого контроллера. То есть у меня есть первый контроллер, в который я перенес container view и отобразил второй контроллер.

В 1 контроллере

создал переменную
var delegate:CurrentTrackDelegate?
и сам протокол
protocol CurrentTrackDelegate
{
func changeCN(_ name: String)
}

и изменяю это так
delegate?.changeCN(“heeeeellloo”)

ВО втором контроллере

import Foundation
import UIKit

class CurrentTrackVC: UIViewController {

@IBOutlet weak var curentName: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print("NO")
    guard segue.identifier == "second" else { return }
    
    guard let destination = segue.destination as? MainPlayerVC else { return }
    
    destination.delegate = self
    print("OK")
}

}

extension CurrentTrackVC: CurrentTrackDelegate {
func changeCN(_ name: String) {
curentName.text = name
print(“workk”)
}
}

и ничего не меняется,
delegate?.changeCN(“heeeeellloo”) это делается в функции, функция вызывается нормально


#2
class MainPlayerVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        (childViewControllers.first as? CurrentTrackVC)?.curentName.text = "Hello"
    }
}

#3

спасибо! А почему не получилось как я делал ?


#4

ContainerView - вы как бы добавляете потомка на основной контроллер.
MainPlayerVC получается “отец” (или “мать”) для CurrentTrackVC и prepare(for:sender:) вызовется у него (у MainPlayerVC), в segue.destination будет CurrentTrackVC и в делегате тут смысла нет. Проще сразу из родителя (MainPlayerVC) обратиться к CurrentTrackVC который будет первый в массиве childViewControllers.