Соответствует протоколу, но ничего не происходит - PullRequest
0 голосов
/ 30 мая 2018

у меня 3 UIViewControllers.ContainerVC, который содержит 2 контейнера.Первый контейнерный вид DashboardVC, а второй SidebarVC.DashboardVC охватывает весь экран, а SidebarVC - снаружи.

У меня есть ведущее ограничение для SidebarVC, которое должно быть анимировано, а SidebarVC должно скользить (с левой стороны).На DashboardVC у меня есть UIBarButtonItem, и когда она нажата, она должна выполнить анимацию.Проблема в том, что я делаю что-то не так с делегатом, и когда ContainerVC соответствует протоколу, ничего не происходит.

PS: Мне очень трудно понимать протоколы / делегатов, несмотря на то, что я смотрел кучу разных видео по этой концепции.Вот код:

Панель управления VC

protocol SideBarDelegate {
    func showMenu()
    func hideMenu()
}

class DashboardVC: UIViewController {

    var delegate: SideBarDelegate?
    var isSideMenuOpen = true

    @IBAction func menuButtonPressed(_ sender: UIBarButtonItem) {

        if isSideMenuOpen {
            delegate?.showMenu()
            isSideMenuOpen = false
        }
        else {
            delegate?.hideMenu()
            isSideMenuOpen = true
        }
    }
}

Контейнер VC

class ContainerVC: UIViewController {

    @IBOutlet weak var sideBarMenuLeadingConstraint: NSLayoutConstraint!
}

extension ContainerVC : SideBarDelegate {
    func showMenu() {
        sideBarMenuLeadingConstraint.constant = -290
        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }
    }
    func hideMenu() {
        sideBarMenuLeadingConstraint.constant = 0
        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }
    }
}

1 Ответ

0 голосов
/ 30 мая 2018

Вы используете делегата только на занятиях.Чтобы предотвратить утечки памяти, сделайте эти две вещи:

Измените:

protocol SideBarDelegate {
    func showMenu()
    func hideMenu()
}

на:

protocol SideBarDelegate: class {
    func showMenu()
    func hideMenu()
}

Теперь переименуйте свойство делегата в:

weak var delegate: SideBarDelegate?

Слабый не увеличивает подсчет ссылок.Это важно для предотвращения утечек памяти.

Ваш экземпляр ContainerVC должен иметь какую-то ссылку на экземпляр DashboardVC (или сделать делегат статическим, но я никогда не видел ничего подобного).Затем в вашем методе viewDidLoad ContainerVC установите это:

myInstanceReferenceToDashboardVC.delegate = self
...