我尝试弄清楚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事件,当发生这种情况时,我们想在didPressAnswerButton:对象
  • 上调用Answer方法
  • 因此,当此TouchUpEvent触发时,我们需要告诉answerButton该怎么办。您可以通过在addTarget:action:forControlEvents
  • 上调用answerButton方法来执行此操作
  • self参数告诉answerButton通知该事件的对象:它是目标。在这种情况下,selfAnswer对象。
  • "didPressAnswerButton:"参数指示为响应tap事件,answerButton应该调用哪种方法:这是
  • Action

    这是Objective-C/ cocoa 的target-action mechanism。这是一种非常常见的模式,值得阅读链接的文档以进一步了解其工作方式。关键在于这是基于传递的Objective-C *消息的:在上面的代码中,"didPressAnswerButton:"指示选择器,当与目标(self)配对时,该选择器告诉answerButton如何在目标发送消息时向目标发送“消息”用户点击按钮。

    另外,请注意,当您从一个按钮编辑 Storyboard 和ctrl拖动到 View Controller 并选择一种方法时,也将使用相同的机制来设置目标/ Action 。您可以通过拖动到 View Controller 图标(或其他图标)来选择目标对象,然后在弹出窗口中单击方法名称时选择操作/选择器。

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

    10-08 05:55