Skip to content

Commit b03cf16

Browse files
committed
close #3659: fix index out of bounds issue when using stacked bar chart
1 parent 86ae253 commit b03cf16

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

Source/Charts/Data/Implementations/Standard/BarChartDataSet.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ open class BarChartDataSet: BarLineScatterCandleBubbleChartDataSet, IBarChartDat
133133
}
134134

135135
/// array of labels used to describe the different values of the stacked bars
136-
open var stackLabels: [String] = ["Stack"]
136+
open var stackLabels: [String] = []
137137

138138
// MARK: - Styling functions and accessors
139139

Source/Charts/Renderers/BarChartRenderer.swift

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -806,15 +806,27 @@ open class BarChartRenderer: BarLineScatterCandleBubbleRenderer
806806

807807
if dataSet.isStacked, let vals = e.yValues
808808
{
809-
let stackLabel = dataSet.stackLabels[idx % stackSize]
809+
let labelCount = min(dataSet.colors.count, stackSize)
810+
811+
let stackLabel: String?
812+
if (dataSet.stackLabels.count > 0 && labelCount > 0) {
813+
let labelIndex = idx % labelCount
814+
stackLabel = dataSet.stackLabels.indices.contains(labelIndex) ? dataSet.stackLabels[labelIndex] : nil
815+
} else {
816+
stackLabel = nil
817+
}
810818

811819
elementValueText = dataSet.valueFormatter?.stringForValue(
812820
vals[idx % stackSize],
813821
entry: e,
814822
dataSetIndex: dataSetIndex,
815823
viewPortHandler: viewPortHandler) ?? "\(e.y)"
816824

817-
elementValueText = stackLabel + " \(elementValueText)"
825+
if let stackLabel = stackLabel {
826+
elementValueText = stackLabel + " \(elementValueText)"
827+
} else {
828+
elementValueText = "\(elementValueText)"
829+
}
818830
}
819831

820832
let dataSetCount = dataProvider.barData?.dataSetCount ?? -1

Source/Charts/Renderers/LegendRenderer.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,21 @@ open class LegendRenderer: Renderer
5252
{
5353
let bds = dataSet as! IBarChartDataSet
5454
var sLabels = bds.stackLabels
55-
56-
for j in 0..<min(clrs.count, bds.stackSize)
55+
let minEntries = min(clrs.count, bds.stackSize)
56+
57+
for j in 0..<minEntries
5758
{
59+
let label: String?
60+
if (sLabels.count > 0 && minEntries > 0) {
61+
let labelIndex = j % minEntries
62+
label = sLabels.indices.contains(labelIndex) ? sLabels[labelIndex] : nil
63+
} else {
64+
label = nil
65+
}
66+
5867
entries.append(
5968
LegendEntry(
60-
label: sLabels[j % sLabels.count],
69+
label: label,
6170
form: dataSet.form,
6271
formSize: dataSet.formSize,
6372
formLineWidth: dataSet.formLineWidth,

0 commit comments

Comments
 (0)