2016-02-25 46 views
2

我試圖找出爲什麼self指向GameViewController代替回答UIButton addTarget如何自行工作?

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) 
    } 
} 

回答

6

addTarget:action:forControlEvents:告訴(在這種情況下answerButton)控制來調用什麼方法,和什麼對象稱呼它上,當用戶敲擊按鈕。看你的代碼的詳細信息:

answerButton.addTarget(self, action: "didPressAnswerButton:", forControlEvents: .TouchUpInside) 
  • 當用戶點擊一個按鈕,就answerButtonTouchUpInside事件觸發,這時我們要調用一個方法didPressAnswerButton:Answer對象
  • 所以,我們需要告訴answerButton當TouchUpEvent觸發時會做些什麼。你做這個調用addTarget:action:forControlEvents方法上answerButton
  • self參數告訴answerButton什麼對象,通知有關該事件的:它是目標。在這種情況下,self是一個Answer對象。
  • "didPressAnswerButton:"參數指示answerButton應該響應輕擊事件稱之爲方法:這是行動

這是Objective-C的/可可的target-action mechanism。這是一種非常常見的模式,閱讀鏈接文檔以瞭解它的工作原理是值得的。關鍵是這是基於Objective-C *消息傳遞:在上面的代碼中,"didPressAnswerButton:"表示選擇器,當與目標配對時(self),告訴answerButton如何向目標發送「消息」當用戶點擊按鈕時。另外,請注意,當您編輯故事板並按住Ctrl並從按鈕拖動到您的視圖控制器並選擇一個方法時,您也正在使用相同的機制設置目標/操作。通過拖動到視圖控制器圖標(或其他圖標)來選擇目標對象,然後在單擊彈出窗口中的方法名稱時選擇動作/選擇器。 * Target-Action最初是爲Objective-C設計的,但對於實現視圖控制器的常見情況,您可以假設Swift的工作方式相同。在閱讀Swift使用簡單字符串進行操作的文檔時請注意,而Objective-C使用@selector(...)

相關問題