【问题标题】:Swift Delegate Not Being CalledSwift 代表没有被调用
【发布时间】:2015-03-07 08:32:46
【问题描述】:

我有一个委托视图,我想在按下按钮时在 GameController 中调用 numpadView(numpadView:),但是我无法让它工作。 touchesBegan() 的重载工作正常,它确实与 pressDelegate?.numpadView(self) 一致,它不调用 GameController 类中的委托函数。我不知道要让它工作还缺少什么?

为了简单起见,我清理了代码,只留下与问题相关的基本内容。

NumpadView.swift

protocol NumpadPressDelegateProtocol {
  func numpadView(numpadView: NumpadView)
}

class NumpadView: UIButton{
  var pressDelegate: NumpadPressDelegateProtocol?

  init(char: Character) {
    let frame = CGRectMake(160, 100, 50, 50)
    super.init(frame:frame)

    self.setTitle("\(char)", forState: UIControlState.Normal)
    self.userInteractionEnabled = true
  }

  override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    pressDelegate?.numpadView(self)
  } 
}

GameController.swift

class GameController: NumpadPressDelegateProtocol {

  func numpadView(numpadView: NumpadView) {
    //do something
  }

}

【问题讨论】:

    标签: ios swift uikit


    【解决方案1】:

    GameController 声明为NumpadPressDelegateProtocol 不足以让您获得回调。您还需要在Gamecontroller 中设置NumpadView 实例的pressDelegate。假设numpadView 是实例变量,无论是否为 IBOutlet,您都必须像这样设置委托

    GameController 内部初始化

     numpadView.pressDelegate = self
    

    【讨论】:

    • 非常感谢。
    【解决方案2】:

    您是否将pressDelegate 属性设置为某个值?您显示的代码中没有分配任何内容。您是否在代码的其他地方为其分配了一些东西?

    【讨论】:

    • 不,我不知道。我应该为它分配什么以及在哪里分配?
    • 您需要创建一个GameController 对象并将其分配给您的pressDelegate 属性。由于GameController 被声明为符合您的NumpadPressDelegateProtocol 协议。然后,当您的touchesBegan 函数执行时,将有一个pressDelegate 对象供其调用numpadView()
    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 2015-01-31
    • 1970-01-01
    • 2015-05-17
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多