0

У меня есть три tableViewController, и они управляются tabBarController. И каждый tabBarItem должен быть предупрежден о просроченных товарах, подобных любым другим приложениям. В моем первом tableViewController я попытался показать количество просроченных предметов внутри tabBarItem's badgeValue. Эти значения исходят от fetchedResultsController's fetchedObjects.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

Как правильно показать «ы badgeValueTabBarItem?

+1

Он достигает даже кода, в котором вы его устанавливаете? Другим вариантом может быть реализация 'controllerDidChangeContent' всякий раз, когда ваша модель изменяется, а затем получить счетчик из вашего' fetchedResultsController' и установить значок на этот номер. – Koen

+0

Когда я добавил новое значение модели и затем исчез. Но снова и снова тот же результат я получу – Mannopson

+1

Пробовал ли вы точку останова на 'viewController.tabBarItem.badgeValue =" "'? Установка badgeValue в 'nil' вместо' '' 'работает в моем проекте. – Koen

ответ

2

Я рекомендую вам реализовать controllerDidChangeContent, который является метод делегата вашего fetchedResultsController. Каждый раз, когда изменяется ваша модель, это будет вызываться, и вы можете запросить счет и обновить свой номер значка.

+1

'func controllerDidChangeContent (_ controller: NSFetchedResultsController ) { self.tabBarBadgeUpdater() self.tableView.endUpdates() }' И работает хорошо! Это решило мою проблему! благодаря – Mannopson

1

Для очистки шахты, я просто установить badgeValue к нулю, а не «»:

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

Спасибо за вашу поддержку и ответ! Я не знаю, где я должен назвать свою функцию? Внутри viewDidAppear или viewWillAppear? Но оба метода ничего не делают во время выполнения. Поэтому я вызывал эту функцию как cellForRowAt indexPath, так и viewDidAppear. Возможно, моя проблема заключается в перезагрузке данных? Еще раз спасибо – Mannopson

+0

Спасибо за вашу помощь! – Mannopson