【问题标题】:Conforming to protocol but nothing happens符合协议但没有任何反应
【发布时间】:2018-11-09 18:14:25
【问题描述】:

我有 3 个UIViewControllersContainerVC 包含 2 个 ContainerView。第一个容器视图是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
        }
    }
}

容器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()
        }
    }
}

【问题讨论】:

  • 在委托的调用上设置断点。您将看到它是空的,因为您从未为委托分配值。这样做的方式与向 tableview.delegate 属性添加值的方式相同
  • 呃,是的,它确实说它是零。但我不太确定该怎么做。

标签: swift xcode uiviewcontroller delegates protocols


【解决方案1】:

您仅在类上使用委托。要防止内存泄漏,请执行以下两件事:

变化:

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

到:

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

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

weak var delegate: SideBarDelegate?

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

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

myInstanceReferenceToDashboardVC.delegate = self

【讨论】:

  • 它确实适用于静态委托。我也在另一个答案中看到了它。这很有帮助。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多