2016-02-25 51 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(...)

相关问题