Функция создана, но никогда не вызывается, но все еще выполняется - PullRequest
0 голосов
/ 23 мая 2018

Я очень новичок в разработке для iOS и Swift, извините, если это тривиальный вопрос.У меня есть следующий код

import UIKit

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    var imagePicker: UIImagePickerController!

    @IBOutlet weak var imageView: UIImageView!

    @IBAction func openGalery(_ sender: UIButton) {
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary;
            imagePicker.allowsEditing = true
            present(imagePicker, animated: true, completion: nil)
        }
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        imagePicker.dismiss(animated: true, completion: nil)
        imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

В коде я создаю func imagePickerController.imagePickerController отвечает за установку выбранного изображения в imageView.Оно работает.Я открываю галерею, выбираю изображение и происходит переход обратно к виду с установленным изображением.Однако почему это работает?Я никогда не вызываю функцию imagePickerController.Сравнивая это с языками, с которыми я работал раньше, я должен вызвать эту функцию по нажатию кнопки выбора в PhotoLibrary.Как событие или что-то.Но здесь он как-то вызывается автоматически, только путем определения функции.Почему это так?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Это шаблон делегирования .

Когда вы устанавливаете делегат imagePicker на self, вы начинаете получать события от средства выбора.

События определеныв protocol.В данном случае это UIImagePickerControllerDelegate

Этот шаблон часто используется в разработке iOS.Подробнее о модели делегирования вы можете прочитать в документации Apple

0 голосов
/ 23 мая 2018

imagePicker.delegate = self

Переводится как: «Эй imagePicker, когда что-то случится, дайте мне знать, вызвав мои UIImagePickerControllerDelegate методы!»

В частности, ваша реализация imagePickerController(_:didFinishPickingMediaWithInfo:) вызывается, что является частью протокола UIImagePickerControllerDelegate.

...