iOS图表、折线图和x27;刷新数据

iOS图表、折线图和x27;刷新数据,ios,ios-charts,swift4,Ios,Ios Charts,Swift4,我有一个问题: 每次我在分段控件的段之间切换时,数据都会被弄乱,但只有在运行时切换并且仅在0段中切换时,1段才能完美地工作,无论我切换多少次。这里有一个gif可以解释我的意思: 如何处理这个问题?这里有一些代码 分段控制的ibaction函数 @IBAction func timeSelectionSegControl(_ sender: UISegmentedControl) { switch sender.selectedSegmentIndex { case 0: last7Fi

我有一个问题: 每次我在分段控件的段之间切换时,数据都会被弄乱,但只有在运行时切换并且仅在0段中切换时,1段才能完美地工作,无论我切换多少次。这里有一个gif可以解释我的意思:

如何处理这个问题?这里有一些代码

  • 分段控制的ibaction函数

    @IBAction func timeSelectionSegControl(_ sender: UISegmentedControl) {
    switch sender.selectedSegmentIndex {
    case 0:
        last7Filler()
    case 1:
        todayFiller()
    case 2:
        last30Filler()
    default:
        break
    } }
    
  • todayFiller()


  • p、 func
    emptyArrays()
    只给数组
    removeAll()
    mid
    high
    lowA
    midA
    higa

    为什么使用
    Double((交叉引用低[键]?.count)
    对于
    last7Filler
    ?@ViniApp中的ChartDataEntry,因为我需要获取与键对应的值的数量作为y值,并且由于字典没有排序,所以我创建了一个以新月模式排序的键数组(
    sortedKeysxxx
    ),以便使用
    Double((crossReferenceLow[key]?.count))获得
    正确的值:对于字典,也许我可以按随机顺序获取元素,但使用此方法,我可以按正确的顺序获取正确的值。您可以发布一些低、中、高值的示例数据吗?为什么要使用
    Double((crossReferenceLow[key]?.count)
    对于
    last7Filler
    ?@ViniApp中的ChartDataEntry,因为我需要获取与键对应的值的数量作为y值,并且由于字典没有排序,所以我创建了一个以新月模式排序的键数组(
    sortedKeysxxx
    ),以便使用
    Double((crossReferenceLow[key]?.count))获得
    正确的值:对于字典,也许我可以按随机顺序获取元素,但使用这种方法,我可以按正确的顺序获取正确的值。您可以发布一些低、中、高值的示例数据吗?
    func todayFiller() {
    emptyArrays()
    low = CoreDataController.shared.loadCigFromSeverityNumber(severity: "Bassa intensità")
    mid = CoreDataController.shared.loadCigFromSeverityNumber(severity: "Media intensità")
    high = CoreDataController.shared.loadCigFromSeverityNumber(severity: "Alta intensità")
    
    for i in low {
        if i.date == currentDate() {       //put in arrays xxxA the elements which have the property .date equals to today
            lowA.append(i)
        }
    }
    
    for i in mid {
        if i.date == currentDate() {
            midA.append(i)
        }
    }
    
    for i in high {
        if i.date == currentDate() {
            highA.append(i)
        }
    }
    
    //low severity fill funcs FOR TIME
    if !lowA.isEmpty || !midA.isEmpty || !highA.isEmpty {
        fillBarChart()
        var lowSeverityDataEntry = [ChartDataEntry]()
        let crossReferenceLow = lowA.reduce(into: [String: [Cig]]()) {
            $0[$1.time!.returnFirstNcharacters(n: 3), default: []].append($1)}
        let sortedKeysLow = Array(crossReferenceLow.keys).sorted(by: <)
    
        for key in sortedKeysLow {
            let matchingTerms = values.filter({
                $0.range(of: key, options: .caseInsensitive) != nil
            })
    
            if matchingTerms.isEmpty {
                print("no elements found in \(key)")
            } else {
                let index = values.index(of: matchingTerms[0])
                let indexString = matchingTerms[0]
                let first3 = indexString.returnFirstNcharacters(n: 3)
    
                let value = ChartDataEntry(x: Double(index!), y: Double((crossReferenceLow[first3]?.count)!))
                lowSeverityDataEntry.append(value)
                doubleArray.append(Double(index!))
                doubleArrayMax.append(Double((crossReferenceLow[first3]?.count)!))
            }
        }
    
    
        let lowSeverityLine = LineChartDataSet(values: lowSeverityDataEntry, label: "Bassa")
        lowSeverityLine.colors = [NSUIColor.green]
        lowSeverityLine.mode = .cubicBezier
        lowSeverityLine.lineCapType = self.lineCap
        lowSeverityLine.lineWidth = self.lineWidth
        lowSeverityLine.circleRadius = self.circleRadius
        lowSeverityLine.circleColors = [NSUIColor.green]
        lowSeverityLine.circleHoleColor = NSUIColor.white
        lowSeverityLine.circleHoleRadius = self.circleHoleRadius
        lowSeverityLine.drawValuesEnabled = false
    
        //mid severity fill funcs FOR TIME
        var midSeverityDataEntry = [ChartDataEntry]()
        let crossReferenceMid = midA.reduce(into: [String: [Cig]]()) {
            $0[$1.time!.returnFirstNcharacters(n: 3), default: []].append($1)}
        let sortedKeysMid = Array(crossReferenceMid.keys).sorted(by: <)
    
        for key in sortedKeysMid {
            let matchingTerms = values.filter({
                $0.range(of: key, options: .caseInsensitive) != nil
            })
    
            if matchingTerms.isEmpty {
                print("no elements found in \(key)")
            } else {
                let index = values.index(of: matchingTerms[0])
                let indexString = matchingTerms[0]
                let first3 = indexString.returnFirstNcharacters(n: 3)
    
                let value = ChartDataEntry(x: Double(index!), y: Double((crossReferenceMid[first3]?.count)!))
                midSeverityDataEntry.append(value)
                doubleArray.append(Double(index!))
                doubleArrayMax.append(Double((crossReferenceMid[first3]?.count)!))
            }
        }
    
        let midSeverityLine = LineChartDataSet(values: midSeverityDataEntry, label: "Media")
        midSeverityLine.colors = [NSUIColor.yellow]
        midSeverityLine.mode = .cubicBezier
        midSeverityLine.lineCapType = self.lineCap
        midSeverityLine.lineWidth = self.lineWidth
        midSeverityLine.circleRadius = self.circleRadius
        midSeverityLine.circleColors = [NSUIColor.yellow]
        midSeverityLine.circleHoleColor = NSUIColor.white
        midSeverityLine.circleHoleRadius = self.circleHoleRadius
        midSeverityLine.drawValuesEnabled = false
    
    
        //high severity fill funcs FOR TIME
        var highSeverityDataEntry = [ChartDataEntry]()
        let crossReferenceHigh = highA.reduce(into: [String: [Cig]]()) {
            $0[$1.time!.returnFirstNcharacters(n: 3), default: []].append($1)}
        let sortedKeysHigh = Array(crossReferenceHigh.keys).sorted(by: <)
    
        for key in sortedKeysHigh {
            let matchingTerms = values.filter({
                $0.range(of: key, options: .caseInsensitive) != nil
            })
    
            if matchingTerms.isEmpty {
                print("no elements found in \(key)")
            } else {
                let index = values.index(of: matchingTerms[0])
                let indexString = matchingTerms[0]
                let first3 = indexString.returnFirstNcharacters(n: 3)
                let value = ChartDataEntry(x: Double(index!), y: Double((crossReferenceHigh[first3]?.count)!))
                highSeverityDataEntry.append(value)
                doubleArray.append(Double(index!))
                doubleArrayMax.append(Double((crossReferenceHigh[first3]?.count)!))
            }
        }
    
        let highSeverityLine = LineChartDataSet(values: highSeverityDataEntry, label: "Alta")
        highSeverityLine.colors = [NSUIColor.red]
        highSeverityLine.mode = .cubicBezier
        highSeverityLine.lineCapType = self.lineCap
        highSeverityLine.lineWidth = self.lineWidth
        highSeverityLine.circleRadius = self.circleRadius
        highSeverityLine.circleColors = [NSUIColor.red]
        highSeverityLine.circleHoleColor = NSUIColor.white
        highSeverityLine.circleHoleRadius = self.circleHoleRadius
        highSeverityLine.drawValuesEnabled = false
    
        let data = LineChartData()
        data.addDataSet(lowSeverityLine)
        data.addDataSet(midSeverityLine)
        data.addDataSet(highSeverityLine)
    
        lineChartView.data = data
    
        guard let min = doubleArray.min() else {return}
        guard let max = doubleArrayMax.max() else {return}
        lineChartView.xAxis.axisMinimum = min
        lineChartView.leftAxis.axisMaximum = max
        let myXaxis = lineChartView.xAxis
        myXaxis.granularity = 1.0
        myXaxis.axisMaximum = Double(values.count)
        myXaxis.labelPosition = .bottom
        myXaxis.gridLineWidth = 0.2
        myXaxis.axisLineWidth = 1.0
        myXaxis.axisLineColor = UIColor.black
        myXaxis.valueFormatter = IndexAxisValueFormatter(values: values)
    
        let yLeftAxis = lineChartView.leftAxis
        yLeftAxis.granularity = 1.0
        yLeftAxis.axisMinimum = 0.0
        yLeftAxis.gridLineWidth = 0.2
        yLeftAxis.axisLineWidth = 1.0
        yLeftAxis.axisLineColor = UIColor.black
    
        lineChartView.rightAxis.enabled = false
        lineChartView.chartDescription?.text = ""
        lineChartView.animate(xAxisDuration: 1.0, easingOption: .linear)
    
    
    } else {
        lineChartView.noDataText = "Nessuna sigaretta fumata oggi"
        barChartView.noDataText = "Nessuna sigaretta fumata oggi"
    } }
    
    func last7Filler() {
    emptyArrays()
    low = CoreDataController.shared.loadCigFromSeverityNumber(severity: "Bassa intensità")
    mid = CoreDataController.shared.loadCigFromSeverityNumber(severity: "Media intensità")
    high = CoreDataController.shared.loadCigFromSeverityNumber(severity: "Alta intensità")
    
    for i in low {
        let first3Date = i.date!.returnFirstNcharacters(n: 3)
        for a in past7Days() {
            let first3Day = "\(a)-"
            if first3Date == first3Day {
                lowA.append(i)
            }
        }
    }
    for i in mid {
        let first3Date = i.date!.returnFirstNcharacters(n: 3)
        for a in past7Days() {
            let first3Day = "\(a)-"
            if first3Date == first3Day {
                midA.append(i)
            }
        }
    }
    for i in high {
        let first3Date = i.date!.returnFirstNcharacters(n: 3)
        for a in past7Days() {
            let first3Day = "\(a)-"
            if first3Date == first3Day {
                highA.append(i)
            }
        }
    }
    
    if !lowA.isEmpty || !midA.isEmpty || !highA.isEmpty {
    
        fillBarChart()
        var lowSeverityDataEntry = [ChartDataEntry]()
        let crossReferenceLow = lowA.reduce(into: [String:[Cig]]() ) {
            $0[$1.date!.returnFirstNcharacters(n: 5), default: []].append($1)}
        let sortedKeysLow = Array(crossReferenceLow.keys).sorted(by: <)
    
        for key in sortedKeysLow {
            let matchingTerms = values.filter({
                $0.range(of: key, options: .caseInsensitive) != nil
            })
    
            if matchingTerms.isEmpty {
                print("no elements found in \(key)")
            } else {
                let index = values.index(of: matchingTerms[0])
                let value = ChartDataEntry(x: Double(index!), y: Double((crossReferenceLow[key]?.count)!))
                lowSeverityDataEntry.append(value)
            }
        }
    
        let lowSeverityLine = LineChartDataSet(values: lowSeverityDataEntry, label: "Bassa")
        lowSeverityLine.colors = [NSUIColor.green]
        lowSeverityLine.mode = .cubicBezier
        lowSeverityLine.lineCapType = self.lineCap
        lowSeverityLine.lineWidth = self.lineWidth
        lowSeverityLine.circleRadius = self.circleRadius
        lowSeverityLine.circleColors = [NSUIColor.green]
        lowSeverityLine.circleHoleColor = NSUIColor.white
        lowSeverityLine.circleHoleRadius = self.circleHoleRadius
        lowSeverityLine.drawValuesEnabled = false
    
    
        var midSeverityDataEntry = [ChartDataEntry]()
        let crossReferenceMid = midA.reduce(into: [String: [Cig]]() ) {
            $0[$1.date!.returnFirstNcharacters(n: 5), default: []].append($1)}
        let sortedKeysMid = Array(crossReferenceMid.keys).sorted(by: <)
    
        for key in sortedKeysMid {
            let matchingTerms = values.filter({
                $0.range(of: key, options: .caseInsensitive) != nil
            })
    
            if matchingTerms.isEmpty {
                print("no elements found in \(key)")
            } else {
                let index = values.index(of: matchingTerms[0])
                let value = ChartDataEntry(x: Double(index!), y: Double((crossReferenceMid[key]?.count)!))
                midSeverityDataEntry.append(value)
            }
        }
    
        let midSeverityLine = LineChartDataSet(values: midSeverityDataEntry, label: "Media")
        midSeverityLine.colors = [NSUIColor.yellow]
        midSeverityLine.mode = .cubicBezier
        midSeverityLine.lineCapType = self.lineCap
        midSeverityLine.lineWidth = self.lineWidth
        midSeverityLine.circleRadius = self.circleRadius
        midSeverityLine.circleColors = [NSUIColor.yellow]
        midSeverityLine.circleHoleColor = NSUIColor.white
        midSeverityLine.circleHoleRadius = self.circleHoleRadius
        midSeverityLine.drawValuesEnabled = false
    
    
        var highSeverityDataEntry = [ChartDataEntry]()
        let crossReferenceHigh = highA.reduce(into: [String: [Cig]]()) {
            $0[$1.date!.returnFirstNcharacters(n: 5), default: []].append($1)}
        let sortedKeysHigh = Array(crossReferenceHigh.keys).sorted(by: <)
    
        for key in sortedKeysHigh {
            let matchingTerms = values.filter({
                $0.range(of: key, options: .caseInsensitive) != nil
            })
            if matchingTerms.isEmpty {
                print("no element found in \(key)")
            } else {
                let index = values.index(of: matchingTerms[0])
                let value = ChartDataEntry(x: Double(index!), y: Double((crossReferenceHigh[key]?.count)!))
                highSeverityDataEntry.append(value)
            }
        }
        let highSeverityLine = LineChartDataSet(values: highSeverityDataEntry, label: "Alta")
        highSeverityLine.colors = [NSUIColor.red]
        highSeverityLine.mode = .cubicBezier
        highSeverityLine.lineCapType = self.lineCap
        highSeverityLine.lineWidth = self.lineWidth
        highSeverityLine.circleRadius = self.circleRadius
        highSeverityLine.circleColors = [NSUIColor.red]
        highSeverityLine.circleHoleColor = NSUIColor.white
        highSeverityLine.circleHoleRadius = self.circleHoleRadius
        highSeverityLine.drawValuesEnabled = false
    
        let data = LineChartData()
        data.addDataSet(lowSeverityLine)
        data.addDataSet(midSeverityLine)
        data.addDataSet(highSeverityLine)
    
        lineChartView.data = data
        lineChartView.notifyDataSetChanged()
        lineChartView.data!.notifyDataChanged()
    
    
        //graphic configuration
        let myXaxis = lineChartView.xAxis
        myXaxis.granularity = 1.0
        myXaxis.axisMinimum = 0.0
        myXaxis.axisMaximum = Double(values.count)
        myXaxis.labelPosition = .bottom
        myXaxis.gridLineWidth = 0.2
        myXaxis.axisLineWidth = 1.0
        myXaxis.axisLineColor = UIColor.black
        myXaxis.valueFormatter = IndexAxisValueFormatter(values: values)
    
        let yLeftAxis = lineChartView.leftAxis
        yLeftAxis.granularity = 1.0
        yLeftAxis.axisMinimum = 0.0
        yLeftAxis.gridLineWidth = 0.2
        yLeftAxis.axisLineWidth = 1.0
        yLeftAxis.axisLineColor = UIColor.black
    
        lineChartView.rightAxis.enabled = false
        lineChartView.chartDescription?.text = ""
        lineChartView.animate(xAxisDuration: 1.0, easingOption: .linear)
    
    } else {
        lineChartView.noDataText = "Nessuna sigaretta fumata nei scorsi 7 giorni"
        barChartView.noDataText = "Nessuna sigaretta fumata nei scorsi 7 giorni"
    }