首页 > 解决方案 > 将参数传递给子视图时预览崩溃

问题描述

我在 SwiftUI 的图表上绘制简单的 y 轴。y 轴定义为以 yMin 和 yMax 作为输入的 View。

当我用虚拟数据尝试这个时,它工作正常。但是,当我将它包含在从 API 调用中获取数据并附加到 VStack 的“onAppear”的视图中时,如果我添加由数据定义的 yMin 之一,但当我同时添加 yMin 和 yMax 时,它不会工作时间。代码看起来像这样

import SwiftUI
import Foundation

struct TestGraph: View{

let apipath = "http://xyz"
@ObservedObject private var myViewModel = MyViewModel()

var body: some View {
   VStack {
        ZStack {
         let yMax = self.myViewModel.data.map(\.Price).max() ?? 0.0
         let yMin = self.myViewModel.data.map(\.Price).min() ?? 0.0

         let yMax2 = CGFloat(yMax)
         let yMin2 = CGFloat(yMin)


         yAxisLabels(yMax: yMax, yMin: yMin)

         LineGraph(dataPoints: self.myViewModel.data.map{CGFloat($0.Price)}

      }
   }
   .onAppear {self.myViewModel.fetchData(apiURL: apipath)}
 }
}

当我硬编码 yMax 和 yMin,甚至只是硬编码其中一个

yAxisLabels(yMax: 138.0, yMin: yMin)

或者

yAxisLabels(yMax: 138.0, yMin: 108)

或者

yAxisLabels(yMax: yMax, yMin: 108)

然后它工作。但是当我使用

yAxisLabels(yMax: yMax, yMin: yMin)

预览崩溃,代码中没有任何错误。

这是 yAxisLabels 代码的代码。

struct yAxisLabels: View {
    var yMax: CGFloat = 141.0
    var yMin: CGFloat = 25.25
    
    var body: some View {
//        let yrange = ymax - ymin
//        let yvalue = ymin + ((yrange)/5).rounded()
//        let yvalueChart = (1.0 - (yvalue-ymin)/yrange) * 200.0
        let yRange = yMax-yMin
        let yRatio1 = (yRange/5.0).rounded()
        let yRatio2 = yRatio1 / yRange
        let yOffset2 = (yMin.rounded() - yMin) / yRange
        let y0 = yMin.rounded() + yRatio1
        let y1 = yMin.rounded() + 2.0*yRatio1
        let y2 = yMin.rounded() + 3.0*yRatio1
        let y3 = yMin.rounded() + 4.0*yRatio1

        GeometryReader { GeometryProxy in
            Text("\(y0, specifier: "%.1f")")
                .font(.caption)
                .offset(x: 8, y: GeometryProxy.size.height*(1-yOffset2-1*yRatio2))
            Text("\(y1, specifier: "%.1f")")
                .font(.caption)
                .offset(x: 8, y: GeometryProxy.size.height*(1-yOffset2-2*yRatio2))
            Text("\(y2, specifier: "%.1f")")
                .font(.caption)
                .offset(x: 8, y: GeometryProxy.size.height*(1-yOffset2-3*yRatio2))
            Text("\(y3, specifier: "%.1f")")
                .font(.caption)
                .offset(x: 8, y: GeometryProxy.size.height*(1-yOffset2-4*yRatio2))
        }
    }
}

我在这里做错了什么?

标签: swift

解决方案


推荐阅读