Передавать данные при отключении модального просмотра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 и добавьте имя протокола в объявление класса:
![введите описание изображения здесь]()
Наконец, вам нужно настоящее мясо всего этого. Не триггер, не сам протокол, не объявление класса... но фактическая функция, которую вы хотите вызвать:
![введите описание изображения здесь]()
Надеюсь, что это поможет
Я не знаю, почему протоколы просто не проваливались сквозь мой толстый череп, но они этого не сделали. Надеюсь, это поможет другим, как я!