2016-05-22 6 views
1

Я успешно передаю данные между двумя контроллерами представления, используя метод делегата.Метод делегата для передачи данных вперед

Первый контроллер просмотра - это экран «Обзор», а второй - экран «Редактировать», в котором в основном содержится UITextView.

Когда я изменяю содержимое текстового вида на экране редактирования и ударяю его, он успешно переходит на экран обзора. Однако, когда я вернусь на экран редактирования, UITextView пуст.

Как я могу убедиться, что экран редактирования сохраняет значение, которое хранится в делегате?

Спасибо, что нашли время, чтобы посмотреть.

Обзор View Controller

class AddCampaignViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, TitleViewDelegate { 

    @IBOutlet var titleSubtitle: UILabel! 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "AddTitleViewController" { 

      let addTitleViewController = segue.destinationViewController as! AddTitleViewController 

      addTitleViewController.delegate = self 

     } 

    } 

    override func viewDidLoad() { 

     super.viewDidLoad() 

    } 


    func setCampaignTitle(campaignTitle: String) { 

     titleSubtitle.text = campaignTitle 

    } 

} 

Edit View Controller

protocol TitleViewDelegate { 

    func setCampaignTitle(campaignTitle: String) 

} 

class AddTitleViewController: UIViewController, UITextViewDelegate { 

    var delegate : TitleViewDelegate! 

    var campaignTitle : String! 

    @IBOutlet var titleTextView: UITextView! 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     titleTextView.becomeFirstResponder() 

     let logButton : UIBarButtonItem = UIBarButtonItem(title: "Save", style: UIBarButtonItemStyle.Plain, target: self, action: "saveTitle:") 

     self.navigationItem.rightBarButtonItem = logButton 

    } 

    func saveTitle(sender: UIBarButtonItem) { 

      delegate.setCampaignTitle(titleTextView.text!) 

      self.navigationController?.popViewControllerAnimated(true) 

    } 

} 

ответ

3

переход создаст новый EditViewController каждый раз. Чтобы передать данные вперед, вам необходимо будет присвоить данные объекту EditViewController, а затем скопировать эти данные в titleTextView.text по методу viewDidLoad. Это необходимо, потому что @IBOutlet s не настроены и остаются nil при запуске prepareForSegue.

Итак:

  1. добавить свойство var textToEdit = "" к вашему EditViewController.
  2. В prepareForSegue установите addTitleViewController.textToEdit = /* the text you want to edit */
  3. В viewDidLoad из EditViewController, установить titleTextView.text = textToEdit.

Примечание:.. Ваш delegate должен быть объявлен weak, чтобы избежать сохранения цикла (что приведет вас к утечкам памяти, никогда не освободив EditViewController твой @IBOutlet s также должны быть объявлены weak

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