2015-12-14 3 views
1

все. Я написал этот код для передачи данных между VC, но я не уверен, почему он не работает.Передача данных между контроллерами View с NSNotificationCenter

Вот код в ViewController1: -

import UIKit 
import Foundation 

let foodDict: [String:String] = [ 
    "Orange": "Fruit", 
    "Carrot": "Vegetable", 
    "Pear": "Fruit", 
    "Spinach": "Vegetable" 
] 

class ViewController1: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSNotificationCenter.defaultCenter().postNotificationName("SEND_STRING", object: nil, userInfo: foodDict) 

    } 
} 

В ViewController2: -

import UIKit 
import Foundation 

class ViewController2: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "printStringDict:", name: "SEND_STRING", object: nil) 
    } 

    func printStringDict(notification: NSNotification) { 

     print("Got the notification...") 
     let foodDictFromVC1 = notification.userInfo as! [String:String] 
     print(foodDictFromVC1) 
    } 

} 

VC2 не получает словарь (так как ничего не печатает). Может кто-нибудь помочь? Заранее спасибо.

+0

Есть ли сообщение «Получено уведомление ...» в консоли? Звучит для меня, что VC2 не загружается до VC1, поэтому наблюдатель еще не существует. –

+0

Существует ли экземпляр 'ViewController2' в момент, когда вызывается функция' viewDidLoad' 'ViewController1'? Об этом уведомлении говорят только наблюдатели, которые существуют во время уведомления. – rmaddy

+2

BTW - это не очень хороший подход. Но трудно быть уверенным, не зная отношений между двумя контроллерами. – rmaddy

ответ

1

Таким образом, проблема заключается в том, что вы отправляете уведомление, но ваш VC2 не инициализирован, поэтому никто не может получить это сообщение, которое вы имели в виду, загрузили в VC1. Лучше использовать prepareForSegue (SEGUE: UIStoryboardSegue, отправитель: AnyObject?) Функцию для обмена данными между двумя ViewControllers, связанных с Segue для например:

import UIKit 
import Foundation 



class ViewController1: UIViewController { 

    let foodDict: [String:String] = [ 
     "Orange": "Fruit", 
     "Carrot": "Vegetable", 
     "Pear": "Fruit", 
     "Spinach": "Vegetable" 
    ] 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "segueIdentifierSetInStoryboard" { 
      if let destinationVC = segue.destinationViewController as? ViewController2{ 
       destinationVC.printStringDict(foodDict) 
      } 
     } 
    } 
} 

class ViewController2: UIViewController {  
    func printStringDict(fooDict:[String:String]) { 
     print(fooDict) 
    } 
} 
+0

Вы также можете использовать singleton в качестве альтернативы, это позволит вам держать foodDict в одном месте, и любой ViewController может иметь к нему доступ. –

+0

Нет, не используйте синглтон. – rmaddy

+0

Спасибо за ответ, Камиль. Я знаю метод segue, но я пытаюсь понять, есть ли способ сделать то же самое с уведомлениями. Это кажется невозможным. – Wertever

0

Если я понимаю: ViewController1 -> ViewController2

В том случай, ваш код никогда не будет работать, потому что в ViewController1 вы публикуете уведомление, но ничто не слушает ваше уведомление, потому что ViewController2 еще не создан!

В ViewController2 вы добавляете наблюдателя, который прослушивает любое уведомление, соответствующее имени «SEND_STRING». Чтобы сделать уведомление, вы должны добавить наблюдателя в ViewController1, а затем запустить уведомление о записи на ViewController2! => ViewController1 будет извещен об этом!