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

Swift 4 iOS:Bar Charts3.05(Build24)无法通过JSON正确更新数据

解决iOS水平条形图工单状态计数更新异常的问题

嘿,我之前做类似的工单统计图表时也踩过这个坑!看起来你的更新逻辑只处理了新状态的计数增加,完全没考虑要把旧状态的计数减少——这就是为什么修改状态后旧状态的数值纹丝不动的原因。

下面是我整理的排查和解决步骤,帮你把逻辑补全:

1. 核心问题拆解

当你把一张工单从「Pending Review」改成「Rejected」时,需要完成两个操作:

  • 给「Pending Review」的计数减1
  • 给「Rejected」的计数加1
    你现在只做了第二步,没做第一步,所以旧状态的数值自然不会变。

2. 具体实现方案(以Swift为例)

假设你用的是自定义的状态计数模型,或者第三方图表库(比如Charts)的数据源,这里给你一个通用的更新逻辑:

第一步:定义状态计数模型(如果还没的话)

struct TicketStatusCount {
    var status: String
    var count: Int
}

// 这是驱动图表的数据源,一定要用var声明成可变数组
var statusCounts: [TicketStatusCount] = [
    TicketStatusCount(status: "Pending Review", count: 10),
    TicketStatusCount(status: "Rejected", count: 2)
]

第二步:补全状态更新的逻辑

func updateTicketStatus(from oldStatus: String, to newStatus: String) {
    // 先处理旧状态:找到对应条目并减1,减到0可以选择移除或保留
    if let oldIndex = statusCounts.firstIndex(where: { $0.status == oldStatus }) {
        var updatedOldEntry = statusCounts[oldIndex]
        updatedOldEntry.count -= 1
        
        if updatedOldEntry.count == 0 {
            statusCounts.remove(at: oldIndex)
        } else {
            statusCounts[oldIndex] = updatedOldEntry
        }
    }
    
    // 再处理新状态:找到对应条目加1,不存在则新增
    if let newIndex = statusCounts.firstIndex(where: { $0.status == newStatus }) {
        var updatedNewEntry = statusCounts[newIndex]
        updatedNewEntry.count += 1
        statusCounts[newIndex] = updatedNewEntry
    } else {
        statusCounts.append(TicketStatusCount(status: newStatus, count: 1))
    }
    
    // 最后一定要刷新图表!
    refreshHorizontalBarChart()
}

第三步:刷新图表的逻辑(以Charts库为例)

func refreshHorizontalBarChart() {
    // 把自定义模型转换成图表需要的BarChartDataEntry
    let entries = statusCounts.enumerated().map { index, item in
        BarChartDataEntry(x: Double(index), y: Double(item.count))
    }
    
    // 创建数据集并设置样式
    let dataSet = BarChartDataSet(entries: entries, label: "Ticket Count")
    // 这里可以设置颜色、字体等样式
    
    // 设置图表数据
    let chartData = BarChartData(dataSet: dataSet)
    yourBarChartView.data = chartData
    
    // 关键:通知图表数据已更新,强制刷新显示
    yourBarChartView.notifyDataSetChanged()
}

3. 容易忽略的坑

  • 数据源必须是可变的:如果你的statusCounts是用let声明的常量数组,修改操作不会生效,一定要改成var。
  • 不要忘记刷新图表:很多时候数据改了但图表没动,就是因为没调用notifyDataSetChanged()(不同库的刷新方法可能不同,查对应文档即可)。
  • 状态字符串要完全匹配:比如检查旧状态的字符串是不是和数据源里的完全一致(大小写、空格都不能错),不然会找不到对应条目导致减1操作失败。

按照这个逻辑改完,你再测试修改工单状态的场景,应该就能看到旧状态计数减少、新状态计数增加的正确效果了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:13