2015-07-20 6 views
0

У меня возникли проблемы с обволакиванием вокруг делегации в Свифте. После прочтения некоторых руководств, я смог настроить его между двумя ViewControllers, но я не понимаю, как это работает. В моем первом контроллере представления у меня есть метка, которая отображает то, что было введено во втором контроллере представления, который содержит текстовое поле и кнопку (которая возвращается к первому контроллеру представления). Вот код для первого контроллера представления:Быстрое делегирование

@IBOutlet weak var labelText: UILabel! 
func userDidEnterInformation(info: String) { 
    labelText.text = info; 
} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if(segue.identifier == "transition"){ 
     let secondVC: SecondViewController = segue.destinationViewController as! SecondViewController; 
     secondVC.delegate = self; 

    }  
} 

Вот код для второго контроллера представления:

protocol DataEnteredDelegate{ 
    func userDidEnterInformation(info: String); 
} 

@IBOutlet weak var userText: UITextField! 
var delegate: DataEnteredDelegate? = nil; 


@IBAction func buttonPressed(sender: AnyObject) { 
    let information = userText.text!; 
    delegate!.userDidEnterInformation(information); 
    self.navigationController?.popToRootViewControllerAnimated(true); 


} 

Я понимаю, что в тексте внутри текстового поля сохраняется в информации постоянной , то вызывается метод userDidEnterInformation из протокола, причем метод определяется внутри первого контроллера представления. Затем этот метод изменяет метку внутри первого контроллера представления. Дело в том, что я не уверен, что происходит в функции prepareForSegue. В частности, я не уверен, в чем цель secondVC.delegate = self.

Я буду признателен за любую четкость в деле делегирования.

+0

BTW, в Swift вы можете опустить точки с запятой в конце каждой строки. Таким образом, ваш код будет выглядеть менее загроможденным. :-) – bio

ответ

0

Протокол, созданный во втором диспетчере просмотра, представляет собой интерфейс. Вы должны реализовать свой первый контроллер представления с помощью протокола DataEnteredDelegate.

class FirstViewController:UIViewController, DataEnteredDelegate{ 
    func userDidEnterInformation(info: String) { 
    //stub 
    } 
} 
0

Если делегат второго ВК не установлен в prepareForSegue() остается nil. Второй VC затем не может вызвать первый VC.

На стороне примечания, если делегат nil, ваш код выйдет из строя, потому что delegate! пытается развернуть необязательное связывание со значением nil. Лучше первый разворачивать переменную делегата:

if let handler = delegate { 
    handler.userDidEnterInformation(information) 
} 

В качестве альтернативы можно использовать Swift's Optional Chaining, вызывая userDidEnterInformation только если delegate не nil.

delegate?.userDidEnterInformation(information); 

Кроме того, рекомендуется объявить делегат weak, чтобы предотвратить сохранение циклов:

weak var delegate: DataEnteredDelegate? 
0

Диаграмма проста, но может помочь вам понять, что происходит.

diagram

FirstViewController должны соответствовать протоколу DataEnteredDelegate вы определили (см ответ SUMIT в). При использовании secondVC.delegate = self, вы говорите, что для Segue transition с назначения являясь SecondViewController, атрибут delegate этого SecondViewController экземпляра будет установлен этот экземпляр FirstViewController, таким образом делегируя вещи от SecondViewController к вашему FirstViewController, как стало возможным благодаря протоколу DataEnteredDelegate ,

0

Делегаты и протоколы

Не пытайтесь выяснить, как словарное определение «делегата» согласуется с концепцией делегирования в Swift. Это не так.

Делегирование в Swift - это соглашение между двумя игроками - воспринимающим объектом и запрашивающим объектом. «Делегат» - это «запрашивающий объект». Просто подумайте, что «asker» или «requester» каждый раз, когда вы видите «делегат», и это будет иметь больший смысл. Вот их согласие ...

Чувствительный Object (Second View Controller):

У меня есть данные из какого-то события, которые имели место. Я опубликую инструкции (протокол) о том, как вы можете получить доступ к этим данным. Если вы этого хотите, вы должны сделать три вещи.

  1. Вы должны объявить в своем классе, что ваш класс выполняет мой протокол.
  2. Вы должны написать функции, которые я описываю в своем протоколе. Мне все равно, что делают эти функции, но тип функции должен соответствовать тому, что я публикую.
  3. В ВАШЕМ коде вы должны установить для меня свойство «делегировать» (думаю, «спрашивающее»). {secondVC.delegate = self} Таким образом, я могу вызвать одну из ВАШИХ функций для доставки данных.

После этого, когда я получу некоторые данные, я вызову одну из функций в вашем объекте, которую я сказал вам написать. Мой вызов вашей функции будет содержать данные, которые вы ищете в качестве одного из аргументов. {delegate! .userDidEnterInformation (информация)} Примечание: делегат! (спрашивает!) ТЫ.

Делегат (запрос) Объект (First View Controller):

Годится У тебя есть сделка.