如何将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
相关产品推荐
相关产品推荐

