2017-09-18 6 views
0

私はラベルにバッジ番号の値を表示したいと思います。Swift - BadUnumberIconのUNUser通知チェックの変更

これまでのところすべてを私のviewWillAppearに入れました。したがって、コントローラがロードされるたびに、変数が割り当てられます。ここでは、コードです:

var deliveredNotif = Int() 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
deliveredNotif = UIApplication.shared.applicationIconBadgeNumber 
myBadgeLabel.text = "\(deliveredNotif)" 
} 

私の質問は: コントローラが有効になっているので、viewWillAppearが既に呼び出されている場合どのように私はdeliveredNotifを更新することができますか?意味は、コントローラにある場合、applicationIconBadgeNumberの値が変更されるたびにdeliveredNotifの値を更新するfuncをトリガする方法はありますか?

ありがとうございました!

------- UPDATE ---- MY SOLUTION 私は一定の変数を作成しました:私は私のAppdelegateで VAR iconBadgeNumber =のNSNumber()

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    completionHandler([.alert, .badge]) 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "applicationIconBadgeNumber"), object: nil) 
    iconBadgeNumber = UIApplication.shared.applicationIconBadgeNumber + 1 as NSNumber 
} 

をし、その後、私のコントローラで:

override func viewDidLoad() { 
    super.viewDidLoad() 
NotificationCenter.default.addObserver(self, selector: #selector(updateIconBadgeNumber), name: NSNotification.Name(rawValue: "applicationIconBadgeNumber"), object: nil) 


} 

@objc func updateIconBadgeNumber() { 
    if iconBadgeNumber == 0 { 
     print("zero") 
    } else { 
    print("there unread notification") 
    } 
} 

答えて

1

あなたは、変更された値についてのオブジェクトに通知するために、3種類の方法があります。

  • 最初に、あなたの値が変更されたときにオブザーバーに通知するために、通知センターがあります。 postをチェックし、インターネット上の詳細情報をご覧ください。

  • また、プロトコルとデリゲートを使用することもできますが、値の通知の更新だけでは重く感じられます。

  • 最後に、postを見てください。これはKey-Value Observing(KVO)の原理を説明しています。

結論として、最終的な記事では、この原則のそれぞれを使用する必要がある場合について説明します。

KVO vs NSNotification vs protocol/delegates?

あなたはすでに複数回に答えている質問を投稿する前にもっと真剣に検討してみてください。

この記事を参考にしてください。

+0

答えのためのThx ...私はすばやく新しいです...そして私はそうしました私の研究...残念ながら私の答えを見つけることができませんでした...私は、NotificationCenterを使用することについて考えて...それは私がやろうとしているものです。私の問題は、残念ながら私にはオブザーバーを置く場所があまり明確ではないということです。 – Marco

0

あなたはキーパス「applicationIconBadgeNumber」のためのオブザーバーとしてごUIViewControllerを設定することができます。リモート通知の

まずレジスタ。あなたのdidFinishLaunchingWithOptions機能では、追加:

let center = UNUserNotificationCenter.current() 
    center.requestAuthorization(options: [.alert, .badge, .sound]) { _, _ in 
     DispatchQueue.main.async { 
      application.registerForRemoteNotifications() 
     } 
    } 

も追加することを忘れないでください:import UserNotificationsをお使いのファイルの先頭に

次に、あなたのviewDidLoadに追加します。

UIApplication.shared.addObserver(self, forKeyPath: "applicationIconBadgeNumber", options: .new, context: nil) 

を次に、上書きobserveValue関数:

override func observeValue(forKeyPath keyPath: String?, 
             of object: Any?, 
              change: [NSKeyValueChangeKey : Any]?, 
              context: UnsafeMutableRawPointer?) { 
     if keyPath == "applicationIconBadgeNumber" { 
      deliveredNotif = UIApplication.shared.applicationIconBadgeNumber 
      myBadgeLabel.text = "\(deliveredNotif)" 
     } 
    } 
+0

私はあなたが提案したものを正確に実行しようとしました...しかし、UIViewControllerが既に開かれている場合observeValueをトリガーしません。 .. – Marco

+0

私は自分の答えを更新しました:まず登録を追加しました。私はサンプルプロジェクトでテストし、それは動作します;) –

関連する問題