我有3 UIViewControllers
。 ContainerVC
包含2个ContainerViews。第一个容器视图为DashboardVC
,第二个容器为SidebarVC
。 DashboardVC
覆盖了整个屏幕,SidebarVC
在外面。
我有一个SidebarVC
的主要约束应该是动画的,SidebarVC
应该滑入(从左侧)。在DashboardVC
我有一个UIBarButtonItem
,当它被按下时,它应该执行动画。问题是我在委托中做错了,当ContainerVC
符合协议时,没有任何反应。
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()
}
}
}
答案 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