0

私はtableViewControllerの3つを持っており、それらはtabBarControllerによって管理されています。また、他のアプリのような期限切れのアイテムについては、各tabBarItemにアラートを送信する必要があります。最初にtableViewController私はtabBarItembadgeValueの中に期限切れのアイテム数を表示しようとしました。これらの値は、fetchedResultsControllerfetchedObjects.countから得られます。TabBarItemのバッジ値を正しく更新するにはどうすればいいですか?

func tabBarBadgeUpdater() { 

    for viewController in (self.tabBarController?.viewControllers)! { 

     let overdue = self.fetchedResultsController.fetchedObjects?.filter({ (record) -> Bool in 
      return (record.date?.compare(Date()) != .orderedDescending) 
     }) 

     print(overdue!.count) 

     if viewController.tabBarItem.tag == 1 { 

      if overdue!.count != 0 { 
       DispatchQueue.main.async(execute: { 
        viewController.tabBarItem.badgeValue = "\(overdue!.count)" 
        viewController.tabBarItem.badgeColor = UIColor.init(red: 0.0, green: 0.5, blue: 0.0, alpha: 1.0) 
        self.tableView.reloadData() 
       }) 
      } else { 
       DispatchQueue.main.async(execute: { 
        viewController.tabBarItem.badgeValue = "" 
        viewController.tabBarItem.badgeColor = .clear 
        self.tableView.reloadData() 
       }) 
      } 
     } 
    } 
} 

しかし、私の問題行は、それらを削除しています。私はモデルから最後のオブジェクトを削除しようとしましたが、まだ値が1

Before deleting

After deleted

どのように正しくTabBarItembadgeValueを表示する方法を示していますのはいつですか?

+1

""に設定したコードに到達していませんか?別のオプションは、モデルが変更されたときに 'controllerDidChangeContent'を実装し、' fetchedResultsController'からカウントを取得し、その番号にバッジを設定することです。 – Koen

+0

モデルに新しい値を追加して消えたとき。しかし、何度も同じ結果が得られます – Mannopson

+1

'viewController.tabBarItem.badgeValue =" "'でブレークポイントを試しましたか? '' ''の代わりにbadgeValueを 'nil'に設定することは私のプロジェクトでうまくいきます。 – Koen

答えて

2

私はあなたがあなたのfetchedResultsControllerのデリゲートメソッドであるcontrollerDidChangeContentを実装することをお勧めします。モデルが変更されるたびにこれが呼び出され、カウントを照会してバッジ番号を更新することができます。

+1

'func controllerDidChangeContent(コントローラー:NSFetchedResultsController ){ self.tabBarBadgeUpdater() self.tableView.endUpdates() }'うまく動作します。それは私の問題を解決しました!ありがとう – Mannopson

1

は明確な鉱山に、私は、ない「」nilにbadgeValueを設定します。

tabController.tabBar.items[0].badgeValue = nil 
+0

ご協力いただきありがとうございます!私はどこに私の機能を呼び出すべきかわからないのですか? viewDidAppearまたはviewWillAppearの内部?しかし、両方のメソッドは実行時に何もしません。したがって、私はこの関数をcellForRowAt indexPathとviewDidAppearの両方として呼び出しました。おそらく私の問題はデータを読み込んでいますか?もう一度ありがとう – Mannopson

+0

あなたの助けに感謝! – Mannopson

関連する問題