我尝试弄清楚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
方法answerButton
该怎么办。您可以通过在addTarget:action:forControlEvents
answerButton
方法来执行此操作self
参数告诉answerButton
通知该事件的对象:它是目标。在这种情况下,self
是Answer
对象。 "didPressAnswerButton:"
参数指示为响应tap事件,answerButton应该调用哪种方法:这是这是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(...)
。