it-swarm.com.ru

NotificationCenter для передачи данных в Swift

Я работаю над тестовым проектом в Swift 3. Я пытаюсь передать строку textField из одного класса в другой класс с помощью NotificationCenter. Я пытаюсь найти ответ по этой ссылке: передать переменную NSString в другой класс с помощью NSNotification и как передать несколько значений с уведомлением в Swift

Я попробовал несколько ответов по вышеуказанной ссылке, но ничего не получалось.

Мой код:

// First VC

import UIKit


extension Notification.Name {        
public static let myNotificationKey = Notification.Name(rawValue: "myNotificationKey")    
}


class ViewController: UIViewController {

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBAction func sendData(_ sender: AnyObject) {

    let userInfo = [ "text" : textView.text ]
    NotificationCenter.default.post(name: .myNotificationKey, object: nil, userInfo: userInfo)

}

}

// SecondVC

 import Foundation
 import  UIKit

 class viewTwo: UIViewController {

@IBOutlet weak var result: UILabel!



override func viewDidLoad() {


}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(self.notificationReceived(_:)), name: .myNotificationKey, object: nil)
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: .myNotificationKey, object: nil)
}

func notificationReceived(_ notification: Notification) {
    guard let text = notification.userInfo?["text"] as? String else { return }
    print ("text: \(text)")

    result.text = text
}

 enter image description here }

Я не уверен, что не так с кодом. Выше код изначально помечен как ответ, который я нашел по первой ссылке. Код был преобразован в Swift. 

8
Joe

Не используйте параметр объекта для передачи данных. Он предназначен для фильтрации уведомлений с тем же именем, но от определенного объекта. Поэтому, если вы передаете какой-либо объект при публикации уведомления, а другой объект - при добавлении addObserver, вы его не получите. Если вы передаете ноль, вы в основном отключаете этот фильтр.

Вместо этого вы должны использовать параметр userInfo.

Во-первых, лучше определить имя уведомления как расширение для Notification.Name. Этот подход намного безопаснее и удобочитаемее:

extension Notification.Name {        
    public static let myNotificationKey = Notification.Name(rawValue: "myNotificationKey")    
}

Опубликовать уведомление:

let userInfo = [ "text" : text ]
NotificationCenter.default.post(name: .myNotificationKey, object: nil, userInfo: userInfo)

Подписывайся:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(self.notificationReceived(_:)), name: .myNotificationKey, object: nil)
}

Отказаться от подписки:

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: .myNotificationKey, object: nil)
}

Метод для вызова:

func notificationReceived(_ notification: Notification) {
    guard let text = notification.userInfo?["text"] as? String else { return }
    print ("text: \(text)")
}
18
alexburtnik

Передать текст с помощью userInfo, который является необязательным словарем типа [AnyHashable: Any]? в Swift 3.0 и это [NSObject: AnyObject]? в Swift 2.0

@IBAction func sendData(_ sender: UIButton) {

// post a notification
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "notificationName"), object: nil, userInfo: ["text": textValue.text])

print(textValue) // textValue printing

}

в viewDidLoad

// Зарегистрироваться для получения уведомления

NotificationCenter.default.addObserver(self, selector: #selector(self. incomingNotification(_:)), name:  NSNotification.Name(rawValue: "notificationName"), object: nil)

и в входящих уведомлениях

func incomingNotification(_ notification: Notification) {
if let text = notification.userInfo?["text"] as? String {
   print(text)
  // do something with your text   
}


}
4
Sahil

В вашем методе sendData передайте textField.text в объект Notification, а в вашем incomingNotification сделайте следующее:

guard let theString = notification.object as? String else {
    print("something went wrong")
    return 
}

resultLabel.text = theString

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

1
Maksym Musiienko