我有3个UIViewControllersContainerVC其中包含2个containerview。第一个容器视图是DashboardVC,第二个是SidebarVCDashboardVC覆盖整个屏幕,而SidebarVC在外部。
我对应该设置动画的SidebarVC有一个前导约束,SidebarVC应该滑入(从左侧)。在DashboardVC上我有一个UIBarButtonItem并且当它被按下时应该执行动画。问题是,我对委托做了一些错误的处理,当ContainerVC符合协议时,什么都不会发生。
注:我很难理解协议/委托,尽管我看过很多关于这个概念的不同视频。代码如下:
仪表盘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
        }
    }
}

集装箱船
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()
        }
    }
}

最佳答案

只能在类上使用委托。要防止内存泄漏,请执行以下两项操作:
更改:

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

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

现在,将委托属性重命名为:
weak var delegate: SideBarDelegate?

弱不会增加引用计数。这对于防止内存泄漏很重要。
您的ContainerVC实例必须具有对DashboardVC实例的某种引用(或者使委托成为静态的,但我从未见过类似的情况)。然后,在ContainterVC的viewDidLoad方法中,设置如下:
myInstanceReferenceToDashboardVC.delegate = self

关于swift - 符合协议(protocol),但没有任何 react ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50612325/

10-13 02:00