符合协议但没有任何反应

时间:2018-05-30 19:43:36

标签: swift xcode uiviewcontroller delegates protocols

我有3 UIViewControllersContainerVC包含2个ContainerViews。第一个容器视图为DashboardVC,第二个容器为SidebarVCDashboardVC覆盖了整个屏幕,SidebarVC在外面。

我有一个SidebarVC的主要约束应该是动画的,SidebarVC应该滑入(从左侧)。在DashboardVC我有一个UIBarButtonItem,当它被按下时,它应该执行动画。问题是我在委托中做错了,当ContainerVC符合协议时,没有任何反应。

PS:虽然在这个概念上观看了大量不同的视频,但我很难理解协议/代表。这是代码:

DashboardVC

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

ContainerVC

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 :(得分:2)

仅在类上使用委托。为了防止内存泄漏,请执行以下两项操作:

更改:

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

为:

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

现在,将委托属性重命名为:

weak var delegate: SideBarDelegate?

弱不会增加引用计数。这对于防止内存泄漏很重要。

您的ContainerVC实例必须对DashboardVC的实例有某种引用(或使委托静态,但我从未见过类似的东西)。然后,在ContainterVC的viewDidLoad方法中,设置:

myInstanceReferenceToDashboardVC.delegate = self