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(...)
.
我试着找出为什么 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
上的 self
参数告诉answerButton
要通知事件的对象:它是 目标 。在此上下文中,self
是一个Answer
对象。"didPressAnswerButton:"
参数表示 answerButton 应该调用什么方法来响应点击事件:这是 action
addTarget:action:forControlEvents
方法
这是 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(...)
.