簡體   English   中英

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事件將在TouchUpInsideanswerButton ,當發生這種情況時,我們想要在Answer對象上調用方法didPressAnswerButton:
  • 因此,我們需要告訴answerButton當TouchUpEvent觸發時該怎么做。 你這樣做就是在answerButtonanswerButton 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM