UIButton addTarget 是如何工作的?

How does UIButton addTarget self work?

我试着找出为什么 self 指向 GameViewController 而不是 Answer

GameViewController.swift

class GameViewController: UIViewController {
    var gameplay = QuestionsController(colors: colors)

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(gameplay.answersController.answers[0].button)
    }

    func didPressAnswerButton(sender: UIButton!) {
        sender.setTitle("Im from GameViewController class", forState: .Normal)
    }
}

QuestionsController.swift

class QuestionsController {
    var question: Question
    var answersController: AnswersController
}

AnswersController.swift

class AnswersController {
    var answers = [Answer]()

    func prepareAnswers() {
        let answer = Answer()
        answers.append(answer)
    }
}

Answer.swift

class Answer{
    let button: UIButton

    func prepareButton() {
        let answerButton = AnswerButton(type: .System)
        answerButton.addTarget(self, action: "didPressAnswerButton:", forControlEvents: .TouchUpInside)
        button = answerButton
    }

    func didPressAnswerButton(sender: UIButton!) {
        sender.setTitle("Im from Answer class", forState: .Normal)
    }
}

addTarget:action:forControlEvents: 告诉控件(answerButton 在这种情况下)要调用什么方法什么对象 在用户点击按钮时调用它。更详细地查看您的代码:

 answerButton.addTarget(self, action: "didPressAnswerButton:", forControlEvents: .TouchUpInside)
  • 当用户点击按钮时,TouchUpInside 事件会在 answerButton 上触发,当发生这种情况时,我们希望在 Answer 上调用方法 didPressAnswerButton:对象
  • 因此,我们需要告诉 answerButton 当此 TouchUpEvent 触发时要做什么。您可以调用 answerButton
  • 上的 addTarget:action:forControlEvents 方法
  • self 参数告诉 answerButton 要通知事件的对象:它是 目标 。在此上下文中,self 是一个 Answer 对象。
  • "didPressAnswerButton:" 参数表示 answerButton 应该调用什么方法来响应点击事件:这是 action

这是 Objective-C/Cocoa 的 target-action mechanism。这是一种非常常见的模式,值得阅读链接的文档以更多地了解它的工作原理。关键是这是基于 Objective-C* 消息传递:在上面的代码中,"didPressAnswerButton:" 表示 select 或 ,当与目标 (self),告诉 answerButton 如何在用户点击按钮时向目标发送 "message"。

此外,请注意,当您编辑故事板并按住 Ctrl 从按钮拖动到视图控制器和 select 方法时,您也在使用相同的机制设置 target/action .您通过拖动到视图控制器图标(或其他图标)来 select 目标对象,然后在弹出窗口中单击方法名称时选择 action/selector。

* Target-Action 最初是为 Objective-C 设计的,但对于实现视图控制器的常见情况,您可以假设 Swift 以相同的方式工作。请注意,在阅读文档时,Swift 使用简单字符串进行操作,而 Objective-C 使用 @selector(...).