1. ホーム
  2. ios

[解決済み] Swift 3でのNotificationCenterの問題 [重複].

2023-03-12 04:38:55

質問

私はSwift 3を学習しており、私は以下のものを使おうとしています。 NSNotificationCenter . 以下は私のコードです。

func savePost(){
    let postData = NSKeyedArchiver.archivedData(withRootObject: _loadedpost)
    UserDefaults.standard().object(forKey: KEY_POST)
}
func loadPost(){
    if let postData = UserDefaults.standard().object(forKey: KEY_POST) as? NSData{
        if let postArray = NSKeyedUnarchiver.unarchiveObject(with: postData as Data) as? [Post]{
                _loadedpost = postArray
        }
    }
    //codeerror
    NotificationCenter.default().post(NSNotification(name: "loadedPost" as NSNotification.Name, object: nil) as Notification)
}

で、これがオブザーバです。

override func viewDidLoad() {
    super.viewDidLoad()
//codeerorr
    NotificationCenter.default().addObserver(self, selector: Selector(("onPostLoaded")), name: "loadedPost", object: nil)
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

いつもエラー "signal SIGBRT" が出ます。オブザーバーで名前を変更しようとすると、エラーにはなりませんが、明らかに何も表示されませんでした。どうしたら直るのでしょうか?

どのように解決するのですか?

Swift 3 & 4

Swift 3、そして現在のSwift 4では、多くのquot;stringly-typed"APIが次のように置き換えられています。 struct ラッパー型" に置き換えられました。Notification は現在 struct Notfication.Name ではなく String . 詳細については、現在ではレガシーとなっている Swift 3への移行ガイド

Swift 2.2 の使い方を説明します。

// Define identifier
let notificationIdentifier: String = "NotificationIdentifier"

// Register to receive notification
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification(_:)), name: notificationIdentifier, object: nil)

// Post a notification
NSNotificationCenter.defaultCenter().postNotificationName(notificationIdentifier, object: nil)

Swift 3 & 4 の使い方を説明します。

// Define identifier
let notificationName = Notification.Name("NotificationIdentifier")

// Register to receive notification
NotificationCenter.default.addObserver(self, selector: #selector(YourClassName.methodOfReceivedNotification), name: notificationName, object: nil)

// Post notification
NotificationCenter.default.post(name: notificationName, object: nil)

// Stop listening notification
NotificationCenter.default.removeObserver(self, name: notificationName, object: nil)

すべてのシステム通知のタイプは、静的定数として Notification.Name の静的定数として定義されました。 .UIApplicationDidFinishLaunching , .UITextFieldTextDidChange など。

を拡張することができます。 Notification.Name を拡張し、システム通知との一貫性を保つために、独自のカスタム通知を作成することができます。

// Definition:
extension Notification.Name {
    static let yourCustomNotificationName = Notification.Name("yourCustomNotificationName")
}

// Usage:
NotificationCenter.default.post(name: .yourCustomNotificationName, object: nil)

Swift 4.2 の使い方を説明します。

システム通知の名前がUIApplicationの一部であることを除いて、Swift 4と同じです。したがって、システム通知との一貫性を保つために、あなたは UIApplication を拡張して、Notification.Nameの代わりに独自のカスタム通知を使用することができます。

// Definition:
UIApplication {
    public static let yourCustomNotificationName = Notification.Name("yourCustomNotificationName")
}

// Usage:
NotificationCenter.default.post(name: UIApplication.yourCustomNotificationName, object: nil)