ДИАГРАММЫ SwiftUI iOS: как получить выделенное значение

#ios #swift #swiftui #ios-charts

#iOS #swift #swiftui #ios-диаграммы

Вопрос:

Использование диаграмм iOS (автор: Дэниел Гинди https://github.com/danielgindi/Charts ) и SwiftUI, я хотел бы получить выбранное значение из линейной диаграммы, выделенное значение, когда пользователь нажимает на него. Выделение работает, я вижу дополнительные строки для этого значения.


После некоторых исследований я обнаружил, что нам нужно создать эту функцию: chartValueSelected(), но в этом случае она никогда не вызывается. Я полагаю, мне нужно иметь дело с делегатом, но я не нашел никакого решения или примера с SwiftUI. Может кто-нибудь помочь? Спасибо LineChart

     import Foundation
    import Charts
    import SwiftUI

    struct GraphMeterLine : UIViewRepresentable {
    var xArray:[Float] = [0,1,2,3,4]
    var yArray:[Float] = [0,3,6,2,12]
    var data = LineChartData()
    let chartline = LineChartView()

        func makeUIView(context: Context) -> LineChartView {
            return chartline
        }

        func updateUIView(_ uiView: LineChartView, context: Context) {
            //when data changes chartd.data update is required
            uiView.data = createGraph()
        }
    
    
    func createGraph() -> LineChartData {
        var lineChartEntry = [ChartDataEntry]()
       
            for i in 0..<yArray.count {
                let value = ChartDataEntry(x: Double(xArray[i]), y: Double(yArray[i]))
                lineChartEntry.append(value)
            }
            
        let line1 = LineChartDataSet(entries: lineChartEntry, label: "Number")
        

        data.addDataSet(line1)

                data.setDrawValues(false)
                return data
    }

    public func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        print("To Display Values X/Y Values here")
    }
    
        typealias UIViewType = LineChartView
        
    }
 

Ответ №1:

Попробую еще одну идею. Я не могу протестировать его прямо сейчас, поэтому не уверен, что он будет работать, но он успешно строится, попробуйте на своей стороне. В ваш код я добавил код:

 var xArray:[Float] = [0,1,2,3,4]
var yArray:[Float] = [0,3,6,2,12]
var data = LineChartData()
let chartline = LineChartView()

class ChartDelegete: ChartViewDelegate {
    func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        print("To Display Values X/Y Values here")
    }
}

let chartDelegete = ChartDelegete()

func makeUIView(context: Context) -> LineChartView {
    chartline.delegate = chartDelegete
    return chartline
}
 

ОБНОВЛЕНО после комментария

Старый ответ

Добавить делегат в определение

 struct GraphMeterLine : UIViewRepresentable, ChartViewDelegate {
 

и установить делегирование

 chartline.delegate = self 
 

в makeUIView (контекст: вызов, например. Это должно сработать.

Комментарии:

1. Спасибо за ответ, но это структура (UIViewProtocol) Я не могу добавить ChartViewDelegate: «Неклассовый тип ‘GraphMeterLine’ не может соответствовать протоколу класса ‘ChartViewDelegate’ » Я пробовал разные решения, используя координатор классов внутри функции struct, но я не могу получить доступ к данным, как я хочу. Другая идея?

2. Я понимаю, какая у вас проблема. Я отредактировал свой ответ с другой идеей, которую я не могу попробовать прямо сейчас для работы. Попробуйте, пожалуйста. Идея кажется странной, но, возможно, может сработать ^ _ ^

3. Все работало отлично. Я не могу поверить, что я застрял на этом так долго, хе-хе, большое спасибо 🙂

4. работал для меня только с диаграммами версии 3.6.0