Search code examples
swiftxcodeios-charts

Migration from Xcode 10.3 to Xcode 11+ breaks call from overridden function in iOS Charts?


I'm currently using Charts with CocoaPods and I have an issue that I don't quite understand.

I created a subclass of PieChartView and overwrote the function calcMinMax from PieChartView in my custom class, allowing me elsewhere to create a custom pie chart of my data.

I've changed the function in PieChartView from internal override func calcMinMax() to open override func calcMinMax(), allowing me to override it in my custom class using public override func calcMinMax():

open class PieChartView: PieRadarChartViewBase
{
...
    open override func calcMinMax()
    {
        calcAngles()
    }
}

public class CustomPieChartView: PieChartView
{
....
    public override func calcMinMax()
    {
        calcAngles()
    }
}

In the demo application, I changed the chartView's type from PieChartView to CustomPieChartView, as well as updated the class type appropriately in PieChartViewController.xib:

class PieChartViewController: DemoBaseViewController {

    @IBOutlet var chartView: CustomPieChartView!

    ...
}

In Xcode 10.3, when the pie chart is about to be displayed, notifyDataSetChanged is called within the class PieRadarCharViewBase, which calls calcMinMax, and as a result calls the overridden calcMinMax in my custom class CustomPieChartView. This works as expected.

FYI: PieChartView is a subclass of PieRadarCharViewBase.

The stack is shown in Xcode 10.3 working correctly:

enter image description here

The problem is, migrating to Xcode 11, without updating any code breaks this functionality, and instead of calling CustomPieChartView::calcMinMax, calls the parent class PieChartView::calcMinMax, leading to a crash (irrelevant to the original issue).

The stack is shown in Xcode 11 working incorrectly:

enter image description here

I've attached the demo app containing the issue to better visualize and replicate my issue.

I simply cannot figure out what is causing this issue. I've tried to raise an issue in the library's repo, but have not received any responses: drawAngles[j] crash in PieChartRenderer using custom PieChartView in Xcode 11+

Does anyone know what is causing this, after running my demo app? demo app

It's best to run the demo using Xcode 10.3 and Xcode 11 to see the difference.


Solution

  • Your problem is that you started changing access levels for classes members in the iOS-Chart library, but not deep enough. You have changed access level for function calcMinMax() in PieChartView class from internal to open. But you have not changed access level for the same function in PieRadarChartViewBase class and so on. Actually, you have to change access levels of calcMinMax() function throughout the class hierarchy.