首页 > 解决方案 > 从 Xcode 10.3 迁移到 Xcode 11+ 会中断 iOS 图表中覆盖函数的调用?

问题描述

我目前正在使用图表与 CocoaPods 一起使用,但我有一个不太明白的问题。

我创建了一个子类PieChartView并覆盖了calcMinMax函数PieChartView,允许我在其他地方创建我的数据的自定义饼图。

我已将函数PieChartView从更改internal override func calcMinMax()open override func calcMinMax(),允许我在自定义类中使用以下方法覆盖它public override func calcMinMax()

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

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

在演示应用程序中,我将 chartView 的类型从 更改PieChartViewCustomPieChartView,并在以下位置适当地更新了类类型PieChartViewController.xib

class PieChartViewController: DemoBaseViewController {

    @IBOutlet var chartView: CustomPieChartView!

    ...
}

在 Xcode 10.3 中,当饼图即将显示时,notifyDataSetChanged在调用 的类PieRadarCharViewBase中调用calcMinMax,结果调用calcMinMax我的自定义类中的覆盖CustomPieChartView这按预期工作。

仅供参考:PieChartViewPieRadarCharViewBase.

堆栈显示在 Xcode 10.3 中正常工作:

在此处输入图像描述

问题是,迁移到 Xcode 11,而不更新任何代码会破坏此功能,而不是调用CustomPieChartView::calcMinMax,而是调用父类PieChartView::calcMinMax,导致崩溃(与原始问题无关)。

堆栈显示在 Xcode 11 中工作不正确

在此处输入图像描述

我附上了包含问题的演示应用程序,以更好地可视化和复制我的问题。

我根本无法弄清楚是什么导致了这个问题。我试图在库的 repo 中提出一个问题,但没有收到任何回复:drawAngles[j] crash in PieChartRenderer using custom PieChartView in Xcode 11+

运行我的演示应用程序后,有谁知道是什么原因造成的?演示应用

最好使用 Xcode 10.3 和 Xcode 11 运行演示以查看差异。

标签: swiftxcodeios-charts

解决方案


您的问题是您开始更改 iOS-Chart 库中类成员的访问级别,但不够深入。您已将类中函数calcMinMax()的访问级别PieChartView从更改internalopen。但是您没有更改类中相同功能的访问级别PieRadarChartViewBase等等。calcMinMax()实际上,您必须在整个类层次结构中更改函数的访问级别。


推荐阅读