Наклейка на значке (badge icon), как сделать?

У меня есть база заказов, которая выводятся в самый обычный table view через customCell. При выводе сортируются по дате.

Задача: сделать так, чтобы в наклейке на значке (badge icon) отображалось количество заказов на сегодня. Имеется ввиду это красный кружочек с цифрами в котором отображается обычно, например, сколько писем непрочитанных или сколько сообщений непрочитанных в вацапе, например. Вот нужно так же отображать количество заказов на сегодня. Ну и как заказ удалил - чтобы число обновлялось. Но не зависимо от того, заходил в заказ или нет, пока он не удален и у него сегодняшняя дата - он считается тоже. Помогите пожалуйста, спасибо)
  • Вопрос задан
  • 174 просмотра
Пригласить эксперта
Ответы на вопрос 3
doublench21
@doublench21
GXN80wx.png
Делал как-то так: (Может можно сделать лучше, может что готовое уже есть. Ради интереса пытался сделать сам)
class IconView: UIView {
    var color: UIColor = .clear
    var iconText: UILabel?
    var popular: Datas.Popular?
    var result: Result?

    init(popular: Datas.Popular) {
        super.init(frame: .zero)
        initialize(with: popular)
    }

    init(result: Result) {
        super.init(frame: .zero)
        initializeResult(with: result)
    }

    // В принципе он тут не нужен вообще
    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initialize()
    }

    private func initialize(with popular: Datas.Popular? = nil) {
        self.popular = popular
        translatesAutoresizingMaskIntoConstraints = false
        isOpaque = false
        backgroundColor = .none
        contentMode = .center

        guard !(popular?.new == false && popular?.newPrice == nil) else { return }
        if let isNew = popular?.new, isNew {
            color = #colorLiteral(red: 0.5411764706, green: 0.6862745098, blue: 0.3411764706, alpha: 1)
        } else {
            color = #colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1)
        }

        var percent = Int()
        if let stringWithNewPrice = popular?.newPrice, let stringWithOldPrice = popular?.price,
            let newPrice = Int(stringWithNewPrice.removingWhitespaces()),
            let oldPrice = Int(stringWithOldPrice.removingWhitespaces()) {
            percent = Int(((oldPrice - newPrice) * 100) / oldPrice)
        }

        iconText = UILabel()
        iconText?.text = (popular?.new)! ? "new" : "-\(percent)%"
        iconText?.textColor = .white
        iconText?.font = iconText?.font.withSize(8.5)
        iconText?.isOpaque = false
        iconText?.backgroundColor = .none
        iconText?.frame.size = CGSize.zero
        iconText?.sizeToFit()
        addSubview(iconText!)
        iconText?.translatesAutoresizingMaskIntoConstraints = false
        iconText?.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        iconText?.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    }

    private func initializeResult(with result: Result? = nil) {
        self.result = result
        translatesAutoresizingMaskIntoConstraints = false
        isOpaque = false
        backgroundColor = .none
        contentMode = .center

        guard !(result?.isNew == false && result?.oldPriceAmount == "") else { return }
        if let isNew = result?.isNew, isNew {
            color = #colorLiteral(red: 0.5411764706, green: 0.6862745098, blue: 0.3411764706, alpha: 1)
        } else {
            color = #colorLiteral(red: 1, green: 0.1491314173, blue: 0, alpha: 1)
        }

        var percent = Int()
        if let stringWithNewPrice = result?.priceAmount, let stringWithOldPrice = result?.oldPriceAmount,
            let newPrice = Double(stringWithNewPrice),
            let oldPrice = Double(stringWithOldPrice) {
            percent = Int(((oldPrice - newPrice) * 100) / oldPrice)
        }

        contentMode = .redraw
        iconText = UILabel()
        iconText?.text = (result?.isNew)! ? "new" : "-\(percent)%"
        iconText?.textColor = .white
        iconText?.font = iconText?.font.withSize(8.5)
        iconText?.isOpaque = false
        iconText?.backgroundColor = .none
        iconText?.frame.size = CGSize.zero
        iconText?.sizeToFit()
        addSubview(iconText!)
        iconText?.translatesAutoresizingMaskIntoConstraints = false
        iconText?.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        iconText?.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    }

    override func draw(_ rect: CGRect) {
        guard !(popular?.new == false && popular?.newPrice == nil) else { return }

        let circle = UIBezierPath(
            arcCenter: CGPoint(x: bounds.midX, y: bounds.midY),
            radius: 10,
            startAngle: 0,
            endAngle: 2 * CGFloat.pi,
            clockwise: true
        )
        circle.addClip()
        color.setFill()
        circle.fill()
    }
}


В классе самой ячейки:
private func updateUI() {
        previewImage.image = popular.image
        price.text = popular.price
        name.text = popular.name
        novelty = IconView(popular: popular)

        addSubview(novelty)
        let guide = layoutMarginsGuide
        novelty.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1).isActive = true
        novelty.leadingAnchor.constraintEqualToSystemSpacingAfter(guide.leadingAnchor, multiplier: 1).isActive = true
        novelty.widthAnchor.constraint(equalToConstant: 20).isActive = true
        novelty.heightAnchor.constraint(equalToConstant: 20).isActive = true
    }
Ответ написан
@sasha1802 Автор вопроса
Спасибо всем большое, получилось вот такое решение (этот код в VC):

let badgeCount: Int = 777
let application = UIApplication.shared
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in }
application.registerForRemoteNotifications()
application.applicationIconBadgeNumber = badgeCount

Но код выводит просто указанное мною количество.

Подскажите, как подсчитать, сколько у меня заказов (ну то есть сколько cell ) у которых дата совпадает с сегодняшней. То есть помогите с кодом где let badgeCount: Int = сколько заказов у которых сегодняшняя дата.

дата выводится так:

let dateString = dateFormatter.string(from: zakaz.zakazDate!)
cell.detailTextLabel?.text = dateString

или хотя бы как подсчитать сколько их вообще заказов на весь table wiew?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
15 авг. 2018, в 01:47
30000 руб./за проект
15 авг. 2018, в 01:09
70000 руб./в месяц
14 авг. 2018, в 22:43
350 руб./за проект