Передавать данные при отключении модального просмотраController в swift

Я пытаюсь передать данные из модального ViewController в его исходный ViewController. Я думаю, что мне нужно использовать делегирование, но оно не работает.

protocol communicationControllerCamera{
    func backFromCamera()
}

class Camera: UIViewController{
    var delegate: communicationControllerCamera

    init(){
        self.delegate.backFromCamera()
    }
}


class SceneBuilder: UIViewController, communicationControllerCamera{
    func backFromCamera(){    // Never called
        println("YEAHH")
    }
}

Метод backFromCamera, который он не вызывал. Что я сделал не так?

Ответ 1

Вы не установили делегат, чтобы он был пуст, когда вы пытались вызвать backFromCamera().

Вот простой рабочий пример, который вы можете проверить. Обратите внимание на использование необязательного типа (?) Для делегата.

// Camera class
protocol communicationControllerCamera {
    func backFromCamera()
}

class Camera: UIViewController {
    var delegate: communicationControllerCamera? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate?.backFromCamera()
    }
}



// SceneBuilder class
class SceneBuilder: UIViewController, communicationControllerCamera {

   override func viewDidLoad() {
       super.viewDidLoad()
   }

   override func viewDidAppear(animated: Bool) {
       super.viewDidAppear(animated)

       var myCamera = Camera()
       myCamera.delegate = self

       self.presentModalViewController(myCamera, animated: true)
   }

   func backFromCamera() {
       println("Back from camera")
   }
}

Вы можете найти всю необходимую информацию в Документация Apple Swift.

Ответ 2

Очевидно, что выбранный ответ правильный, но это мне не помогло. Однако я успешно выполнял протоколы, поэтому я хотел дать свое объяснение, если кто-то борется с пониманием концепции, как и я.

Код протокола написан в трех местах:

  • Два класса ViewController
  • Сам протокол (код, написанный вне классов VC)

Когда я пишу свои протоколы, я помещаю их в свой документ "ToolBox", и я все еще пишу комментарии, чтобы напомнить себе, какие VC делают что. Два примера:

1. Код основного протокола

Итак, всегда есть:

  • Код протокола (показано выше)
  • Код в VC, который инициирует действие
  • Код в VC, который делегирован для выполнения действия

1. Код протокола

См. изображение выше для справки. По сути, код протокола - это то, где вы указываете имя протокола и объявляете, какие функции вы хотите удаленно вызывать/делегировать. Назовите протокол. Объявите имена функций, которые могут быть вызваны, и объявите их типы параметров, такие как строка и т.д.

2. Код в VC, который инициирует действие

Это код, который инициирует протокол. В этом примере это код из ячейки таблицы, который должен делегировать некоторую работу обратно в главную таблицу VC. Первый скриншот показывает создание переменной делегата, а второй скриншот - это фактическое использование этой переменной.

введите описание изображения здесь

Таким образом, приведенный ниже код является кнопками таблицы. Все они должны запускать код вне ячейки VC, поэтому все они запускают функции, используя протокол, который я объявил выше.

введите описание изображения здесь

3. Код в VC, который делегирован для выполнения действия

Теперь вызывается протокол, но какой VC отвечает на вызов? Чтобы ответить на этот вопрос, выберите VC и добавьте имя протокола в объявление класса:

введите описание изображения здесь

Наконец, вам нужно настоящее мясо всего этого. Не триггер, не сам протокол, не объявление класса... но фактическая функция, которую вы хотите вызвать:

введите описание изображения здесь

Надеюсь, что это поможет

Я не знаю, почему протоколы просто не проваливались сквозь мой толстый череп, но они этого не сделали. Надеюсь, это поможет другим, как я!