From b03cf16ec47437c066e17b5b8f77322111695e6a Mon Sep 17 00:00:00 2001 From: Pierre-Marc Airoldi Date: Mon, 8 Oct 2018 15:48:30 -0400 Subject: [PATCH] close #3659: fix index out of bounds issue when using stacked bar chart --- .../Standard/BarChartDataSet.swift | 2 +- Source/Charts/Renderers/BarChartRenderer.swift | 16 ++++++++++++++-- Source/Charts/Renderers/LegendRenderer.swift | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift b/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift index 27ed7a5722..1bdca1b0f8 100644 --- a/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift +++ b/Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift @@ -133,7 +133,7 @@ open class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, IBarChartDat } /// array of labels used to describe the different values of the stacked bars - open var stackLabels: [String] = ["Stack"] + open var stackLabels: [String] = [] // MARK: - Styling functions and accessors diff --git a/Source/Charts/Renderers/BarChartRenderer.swift b/Source/Charts/Renderers/BarChartRenderer.swift index 4b97863aad..23e4ae3409 100644 --- a/Source/Charts/Renderers/BarChartRenderer.swift +++ b/Source/Charts/Renderers/BarChartRenderer.swift @@ -806,7 +806,15 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer if dataSet.isStacked, let vals = e.yValues { - let stackLabel = dataSet.stackLabels[idx % stackSize] + let labelCount = min(dataSet.colors.count, stackSize) + + let stackLabel: String? + if (dataSet.stackLabels.count > 0 && labelCount > 0) { + let labelIndex = idx % labelCount + stackLabel = dataSet.stackLabels.indices.contains(labelIndex) ? dataSet.stackLabels[labelIndex] : nil + } else { + stackLabel = nil + } elementValueText = dataSet.valueFormatter?.stringForValue( vals[idx % stackSize], @@ -814,7 +822,11 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer dataSetIndex: dataSetIndex, viewPortHandler: viewPortHandler) ?? "\(e.y)" - elementValueText = stackLabel + " \(elementValueText)" + if let stackLabel = stackLabel { + elementValueText = stackLabel + " \(elementValueText)" + } else { + elementValueText = "\(elementValueText)" + } } let dataSetCount = dataProvider.barData?.dataSetCount ?? -1 diff --git a/Source/Charts/Renderers/LegendRenderer.swift b/Source/Charts/Renderers/LegendRenderer.swift index 9c378c3d9b..dc98b8b6a4 100755 --- a/Source/Charts/Renderers/LegendRenderer.swift +++ b/Source/Charts/Renderers/LegendRenderer.swift @@ -52,12 +52,21 @@ open class LegendRenderer: Renderer { let bds = dataSet as! IBarChartDataSet var sLabels = bds.stackLabels - - for j in 0.. 0 && minEntries > 0) { + let labelIndex = j % minEntries + label = sLabels.indices.contains(labelIndex) ? sLabels[labelIndex] : nil + } else { + label = nil + } + entries.append( LegendEntry( - label: sLabels[j % sLabels.count], + label: label, form: dataSet.form, formSize: dataSet.formSize, formLineWidth: dataSet.formLineWidth,