You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将UIApplication.applicationIconBadgeNumber绑定至ModelData的myArray同步角标?

实现应用图标角标与数组元素数量绑定

当然可以实现,下面提供两种简洁实用的方案:

方案一:在ModelData内部监听数组变化

利用Combine框架监听myArray的发布者,在数组元素数量变动时自动更新应用角标:

import Combine
import UIKit

@MainActor
final class ModelData: ObservableObject {
  @Published var myArray: [MyData] = []
  private var cancellables = Set<AnyCancellable>()

  init() {
    // 监听数组变化,同步更新角标数字
    $myArray
      .map { $0.count }
      .sink { count in
        UIApplication.shared.applicationIconBadgeNumber = count
      }
      .store(in: &cancellables)
  }
  //...
}

方案二:在View中监听数组变化

如果不想在Model层处理UI相关逻辑,可以在根视图里通过onReceive监听数组更新:

import SwiftUI
import UIKit

struct ContentView: View {
  @EnvironmentObject var modelData: ModelData

  var body: some View {
    // 你的视图内容
    Text("Hello World")
      .onReceive(modelData.$myArray) { array in
        UIApplication.shared.applicationIconBadgeNumber = array.count
      }
  }
}

关键注意事项

  • 权限要求:iOS 10及以上版本,设置应用角标必须先获取用户的通知权限,否则设置操作会失效。你需要在Info.plist中添加NSUserNotificationUsageDescription权限描述文本,并在App启动时主动请求权限:
import UserNotifications

func requestNotificationPermission() {
  UNUserNotificationCenter.current().requestAuthorization(options: .badge) { granted, error in
    if let error = error {
      print("请求通知权限失败:\(error.localizedDescription)")
    }
  }
}
  • 线程安全:因为你的ModelData已标记@MainActor,监听回调默认在主线程执行,无需额外处理线程问题;View中的onReceive也默认在主线程运行,直接更新角标即可。

内容的提问来源于stack exchange,提问作者user1195883

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:32:11