【问题标题】:Protocol not firing协议未触发
【发布时间】:2017-04-02 20:14:23
【问题描述】:

我的协议根本没有触发,我正在使它符合我希望它触发的方法。任何帮助将不胜感激!

public class NoteCardView:UIView {
@IBInspectable var delegate: NoteCardViewDelegate?

 func handleTitleLabelTap(_ recognizer:UITapGestureRecognizer) {
    // Verified this function is being called and has the right value!
self.delegate?.noteCardViewTitleLabelDidRecieveTap(MainViewController.NoteCardArray[Int(recognizer.view!.tag)])
 }
}

public protocol NoteCardViewDelegate {
// This should be being fired..
func noteCardViewTitleLabelDidRecieveTap(_ view: NoteCardView!)
}

extension MainViewController: NoteCardViewDelegate {
// this is what the handleTitleLabelTap function should do!
func noteCardViewTitleLabelDidRecieveTap(_ view: NoteCardView!) {
    print("6")
    let card:NoteCardView = (view)
    UIView.animate(withDuration: 0.5, delay: 0.0, options: UIViewAnimationOptions.curveEaseInOut, animations: {

        card.contentView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: (self.elementPlacement / 4) + 20)

        card.contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 100)

    }, completion: { (finished: Bool) in

        self.elementPlacement = (self.elementPlacement + 1)
        card.titleLabelTapGestureRecognizer!.isEnabled = !(self.elementPlacement == 5)
    })
}
}

【问题讨论】:

  • 为什么要删除之前的问题?设置点击手势的代码在哪里?
  • @rmaddy 我意识到我之前的问题措辞不当并且有多余的代码。我的点击手势的代码在测试后确实有效,我输入了打印语句并发现它正在触发方法 handleTitleLabelTap。 handleTitleLabelTap 现在没有触发协议,因此这个问题。很抱歉造成混乱!
  • 显然self.delegatenil。在确认这是真的之后找出原因。

标签: ios swift uibutton uitapgesturerecognizer


【解决方案1】:

这一行:

self.delegate?.noteCardViewTitleLabelDidRecieveTap(MainViewController.NoteCardArray[Int(recognizer.view!.tag)])

...如果 self.delegate 为 nil,则不会做任何事情。这 ”?”告诉编译器检查 nil 并在 is nil 时停止。

我建议添加打印语句:

print("About to call delegate. delegate = \(delegate)") delegate?.noteCardViewTitleLabelDidRecieveTap(MainViewController.NoteCardArray[Int(recognizer.view!.tag)])

顺便说一句,self 是不需要的,你应该省略它。您通常需要指定 self 的唯一一次是在闭包中,编译器坚持将其包含在内以“使捕获语义显式”。我的建议是除非编译器抱怨,否则不要使用它。

还要注意,说“我的协议没有触发”是没有意义的。协议是商定的一组方法/属性。它就像一种用于在理解协议的对象之间进行通信的术语。最好说“我的委托方法没有被调用。”

【讨论】:

  • 自从您接受了我的回答并删除了您询问如何设置您想出的代表的评论后,我就知道了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 2018-12-15
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多