Delegates/Protocols UIView 和 UIViewController 之间不工作

Delegates/Protocols between UIView & UIViewController not working

我正在做一个项目,我试图在 UIView 和 UIViewController 之间 运行 一些 delegates/protocols。在这个项目中,我还有其他一些 delegates/protocols 到 运行,但有一个让我非常难过。

我已经搜索了 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()
    }
}

这是我的 Protocol.swift...

protocol SideMenuHomeDelegate {
    func handleSideMenuHome()
}

将 SideMenuHomeView 添加到 MapController

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)
}

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

当我将我的动画代码块连接到 UIView 上的按钮时,它起作用了,所以不是那样。我发现这是我的 delegate/protocol 代码,但无法弄清楚它有什么问题。

有人会碰巧知道我当前的代码有什么问题吗?在 UIView 和 UIViewController 之间是否有 suggested/better 通信方式?

谢谢!

如果您在添加 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 上的所有方法。这就像对同一个对象的两个引用。