2014-12-15 2 views
9

Пользователь находится в контроллере вида, который вызывает модальный. Когда self.dismissViewController вызывается в модальном режиме, функция должна запускаться на контроллере исходного представления. Эта функция также требует переменную, переданную из модальной.Swift: выполнить функцию на ViewController после отклонения модального

Этот модальный может быть отображен с нескольких контроллеров, поэтому функция не может быть вызвана непосредственно в viewDidDisappear на модальном представлении.

Как это можно сделать быстрым?

+0

В чем проблема? Разве вы не знаете, как разговаривать с одного контроллера? – matt

+0

Мне нужно выполнить функцию из VC, которая первоначально отображала модальный. Если это было segue, я мог бы сделать это через prepareForSegue с условными выражениями на основе идентификатора segue, но это, похоже, не работает при использовании функции rejectViewController из модального. –

+0

Возможно, вы захотите сделать это, используя развязку segue на модальном уровне, таким образом вы можете настроить функцию на родительском объекте, который вызывается при его размотке. http://stackoverflow.com/questions/12561735/what-are-unwind-segues-for-and-how-do-you-use-them – porglezomp

ответ

6

Как насчет delegate?

Или вы можете сделать ViewController так:

typealias Action = (x: AnyObject) ->() // replace AnyObject to what you need 
class ViewController: UIViewController { 
    func modalAction() -> Action { 
    return { [unowned self] x in 
     // the x is what you want to passed by the modal viewcontroller 
     // now you got it 
    } 
    } 
} 

И в модальный:

class ModalViewController: UIViewController { 
    var callbackAction: Action? 
    override func viewDidDisappear(_ animated: Bool) { 
    let x = … // the x is what you pass to ViewController 
    callbackAction?(x) 
    } 
} 

Конечно, когда вы показываете ModalViewController необходимость установить callbackAction как это modal.callbackAction = modalAction() в ViewController

4

Мне удалось достичь желаемого результата, установив глобальную переменную как bool ean от контроллера модального просмотра. Переменная инициируется и становится доступной из структуры в отдельном классе.

Когда модальное отклонение отклонено, метод viewDidAppear на контроллере исходного представления отвечает соответственно значению глобальной переменной и, при необходимости, переворачивает значение для глобальной переменной.

Я не уверен, является ли это наиболее эффективным способом с точки зрения производительности, но он отлично работает в моем сценарии.

6

Ответ, поставленный и выбранный вопросом (Майкл Воккола), не сработал для меня, поэтому я хотел указать другой вариант ответа. Его ответ не сработал для меня, потому что viewDidAppear не работает, когда я отклоняю модальное представление.

У меня есть таблица и модальный VC, который появляется и принимает некоторый ввод таблицы. У меня не было проблем с отправкой исходной VC новой переменной переменной модала. Однако у меня возникли проблемы с тем, чтобы таблица автоматически запускала функцию tableView.reloadData после отклонения модального представления.

Ответ, который работал для меня было в предыдущих комментариях:

Вы, вероятно, хотите сделать это с помощью разматывания SEGUE на модальный, что образом, вы можете настроить функцию родительского, который получает когда он раскручивает. переполнение стека.ком/вопросы/12561735/... - porglezomp 15 декабря '14 в 3:41

И если вы только разматывать один шаг (VC2 к VC1), вам нужно всего лишь фрагмент данного ответа:

Шаг 1: метод вставки в VC1 код

при выполнении разматывания SEGUE, необходимо указать действие, которое является метод действия контроллера вида вы хотите отдохнуть в:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) { 
    //Insert function to be run upon dismiss of VC2 
} 

Шаг 2: В раскадровке, в представленном VC2, перетащите кнопку на значок выхода и выберите «unwindToThisViewController»

После добавления метод действия, вы можете определить раскрутите в разделе раскадровки, перетащив управление на значок «Выход».

И все. Эти два шага работали для меня. Теперь, когда мой модальный вид отклонен, моя таблица обновляется. Просто подумал, что я добавлю это, если кто-то еще не решит выбранный ответ.

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