2016-02-25 3 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) 
  • Когда пользователь нажимает на кнопку, TouchUpInside событие срабатывает на answerButton, и когда это произойдет, мы хотим вызвать метод didPressAnswerButton: на Answer объекта
  • Итак, мы должны сообщить answerButton, что делать, когда срабатывает этот TouchUpEvent. Вы делаете это вызов метода addTarget:action:forControlEvents на answerButton
  • The self аргумент указывает answerButton какой объект уведомить об этом событии: это цель. В этом контексте self является объектом Answer.
  • "didPressAnswerButton:" аргумент указывает на то, что метод answerButton должен вызвать в ответ на событие водопроводную: это Действие

Это target-action mechanism из Objective-C/Cocoa. Это очень распространенная картина, стоит прочитать связанную документацию, чтобы узнать немного больше о том, как она работает. Ключ состоит в том, что это основано на передаче сообщений Objective-C *: в приведенном выше коде "didPressAnswerButton:" указывает селектор , который при соединении с целью (self) сообщает ответу, как отправить «сообщение» целевой точке когда пользователь нажимает кнопку.

Также обратите внимание, что при редактировании раскадровки и ctrl-перетаскивании с кнопки на контроллер просмотра и выборе метода вы также настраиваете цель/действие с использованием этого же механизма. Вы выбираете целевой объект, перетаскивая его на значок контроллера просмотра (или какой-либо другой значок), а затем вы выбираете действие/селектор при нажатии на имя метода во всплывающем окне.

* Target-Action был первоначально разработан для Objective-C, но для обычного случая реализации контроллера вида вы можете предположить, что Swift работает одинаково. Просто отметьте при чтении документации, что Swift использует простые строки для действий, тогда как Objective-C использует @selector(...).

Смежные вопросы