[英]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
事件將在TouchUpInside
上answerButton
,當發生這種情況時,我們想要在Answer
對象上調用方法didPressAnswerButton:
answerButton
當TouchUpEvent觸發時該怎么做。 你這樣做就是在answerButton
上answerButton
addTarget:action:forControlEvents
answerButton
方法 self
參數告訴answerButton
要通知的關於事件的對象:它是目標 。 在這種情況下, self
是一個Answer
對象。 "didPressAnswerButton:"
參數指示answerButton響應tap事件應調用的方法:這是動作 這是Objective-C / Cocoa的目標 - 行動機制 。 這是一種非常常見的模式,閱讀鏈接文檔以了解它的工作原理是值得的。 關鍵是這是基於Objective-C *消息傳遞:在上面的代碼中, "didPressAnswerButton:"
表示一個選擇器 ,當與目標( self
)配對時,告訴answerButton如何向“...”發送“消息”用戶點擊按鈕時的目標。
另請注意,在編輯故事板並按住Ctrl鍵並從按鈕拖動到視圖控制器並選擇方法時,您還可以使用相同的機制設置目標/操作。 您可以通過拖動到視圖控制器圖標(或其他某個圖標)來選擇目標對象,然后在單擊彈出窗口中的方法名稱時選擇操作/選擇器。
* Target-Action最初是為Objective-C設計的,但是對於實現視圖控制器的常見情況,您可以假設Swift以相同的方式工作。 請注意,在閱讀文檔時,Swift使用簡單的字符串進行操作,而Objective-C使用@selector(...)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.