UIView 和 UIViewController 之间的委托/协议不起作用



我正在做一个项目,我正在尝试在UIView和UIViewController之间运行一些委托/协议。我在这个项目中还有其他一些委托/协议要运行,但有一个让我非常难倒。

我已经通过Google和SO进行了搜索,但尚未找到解决方案,因此我希望有人可以在这里帮助我。

这是我的UIView的片段...

class SideMenuHomeView: UIView {
var expansionState: SideMenuExpansionState!
var mapController: MapController!
enum SideMenuExpansionState {
case NotExpanded
case Expanded
}
override init(frame: CGRect) {
super.init(frame: frame)
let mapController = MapController()
mapController.menuDelegate = self
expansionState = .NotExpanded
}   
func handleSideMenuToggle() {
if expansionState == .NotExpanded {
animateInputView(targetPosition: self.frame.origin.x + 300) { (_) in
self.expansionState = .Expanded
}
}
}
extension SideMenuHomeView: SideMenuHomeDelegate {
func handleSideMenuHome() {
handleSideMenuToggle()
}
}

这是我的UIViewController的片段...

class MapController: UIViewController {
var menuDelegate: SideMenuHomeDelegate!
@objc func handleOpenMenu() {
menuDelegate?.handleSideMenuHome()
}
}

这是我的协议.swift...

protocol SideMenuHomeDelegate {
func handleSideMenuHome()
}

将侧边菜单主页视图添加到地图控制器

func configureSideMenuHomeView() {
sideMenuHomeView = SideMenuHomeView()
view.addSubview(sideMenuHomeView)
sideMenuHomeView.anchorwithConstant(top: view.topAnchor, bottom: view.bottomAnchor, leading: view.leadingAnchor, trailing: nil, paddingTop: 0, paddingBottom: 0, paddingLeading: -(view.frame.width - 20), paddingTrailing: 0, width: view.frame.width, height: 0)
}

我想要实现的是,当我点击UIView控制器上的按钮时,UIView将X轴上的300像素向右移动。

当我将我的动画代码块连接到 UIView 上的按钮时,它可以工作,所以事实并非如此。我已经弄清楚它是我的委托/协议代码,但无法弄清楚它有什么问题。

有人碰巧知道我当前的代码出了什么问题吗?是否有一种建议/更好的方式在UIView和UIViewController之间进行通信?

谢谢!

如果您在添加SideMenuHomeView时设置delegate,您的问题将得到解决,如下所示,

func configureSideMenuHomeView() {
sideMenuHomeView = SideMenuHomeView()
view.addSubview(sideMenuHomeView)
self.menuDelegate = sideMenuHomeView
sideMenuHomeView.anchorwithConstant(top: view.topAnchor, bottom: view.bottomAnchor, leading: view.leadingAnchor, trailing: nil, paddingTop: 0, paddingBottom: 0, paddingLeading: -(view.frame.width - 20), paddingTrailing: 0, width: view.frame.width, height: 0)
}

但是您在这里使用了错误的委派。当您有SideMenuHomeViewinstance时,您不需要显式delegate引用,因为您已经在instance上拥有所有方法。这就像对同一对象的两个引用。

最新更新