我有3个UIViewControllers
。ContainerVC
其中包含2个containerview。第一个容器视图是DashboardVC
,第二个是SidebarVC
。DashboardVC
覆盖整个屏幕,而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/