我试着找出原因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)
}
}
快速回答
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:
on an Answer
object
- 所以,我们需要告诉
answerButton
当此 TouchUpEvent 触发时做什么。你这样做调用addTarget:action:forControlEvents
方法上的answerButton
- The
self
论证告诉answerButton
要通知哪个对象有关该事件:它是target。在此背景下,self
is an Answer
object.
- The
"didPressAnswerButton:"
参数指示answerButton应该调用什么方法来响应点击事件:这是action
这是目标-行动机制Objective-C/Cocoa 的。这是一种非常常见的模式,值得阅读链接的文档以了解更多有关其工作原理的信息。关键是这是基于 Objective-C* 消息传递:在上面的代码中,"didPressAnswerButton:"
表示一个selector,当与目标(self
),告诉answerButton当用户点击按钮时如何向目标发送“消息”。
另请注意,当您编辑情节提要并从按钮按住 Ctrl 键拖动到视图控制器并选择方法时,您还使用相同的机制设置目标/操作。您可以通过拖动到视图控制器图标(或其他一些图标)来选择目标对象,然后在弹出窗口中单击方法名称时选择操作/选择器。
* Target-Action 最初是为 Objective-C 设计的,但对于实现视图控制器的常见情况,您可以假设 Swift 的工作方式相同。请注意,在阅读文档时,Swift 使用简单的字符串来执行操作,而 Objective-C 使用@selector(...)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)