Как привязать значение словаря к элементу управления SwiftUI? - PullRequest
2 голосов
/ 02 марта 2020

У меня есть class DataPoint, которое является значением словаря.

DataPoint имеет переменную-член value, которую мне нужно связать с Slider в SwiftUI.

Я предоставляю данные class AppData как @Environment Object для SwiftUI, словарь содержит экземпляры class DataPoint.

Мне не удается связать переменную-член DataPoint.value с SwiftUI Slider значение.

Это соответствующие фрагменты кода.

Данные @Published:

class AppData: ObservableObject {
    @Published var dataPoints: [UUID : DataPoint] = [:] {
    ...
}

Структура данных:

class DataPoint: Identifiable {
    var id = UUID()
    var value: Double
}

Представление SwiftUI для DataPoints AppDataList:

struct AppDataList: View {
    @EnvironmentObject var appData: AppData

    var body: some View {
        NavigationView {
            List(Array(appData.dataPoints.values)) { dataPoint in
                NavigationLink(destination: DataPointDetail(dataPointID: dataPoint.id)) {
                    Text("\(dataPoint.value)")
                }
            }
    ...
}

Представление SwiftUI DataPointDetail, с которым я борюсь, на него ссылаются из AppDataList:

struct DataPointDetail: View {
    @EnvironmentObject var appData: AppData
    var dataPointID: UUID

    var body: some View {
        HStack(alignment: .top) {
            VStack(alignment: .leading) {
                Text("Data Point Detail")
                Text("\(appData.dataPoints[dataPointID]!.value)")
/* This line */
/* troubles  */
/* me!       */
/*  --->     */ Slider(value: appData.dataPoints[dataPointID]?.value, in: 0...10000)
                Spacer()
                Text("\(appData.dataPoints[dataPointID]!.id)")
            }
        }
    }
}

The root представление контента:

struct ContentView: View {
    @EnvironmentObject var appData: AppData

    var body: some View {
        VStack {
            if appData.dataPoints.count > 0 {
                AppDataList()
            } else {
                NoDataPoints()
            }
        }
    }
}

Создание представления контента root в SceneDelegate:

        let contentView = ContentView()
            .environmentObject(appData)

В редакторе появляется ошибка: Static member 'leading' cannot be used on instance of type 'HorizontalAlignment', и она находится в строка VStack в представлении DataPointDetail. Я считаю, что это не имеет никакого отношения к VStack.

Static member 'leading' cannot be used on instance of type 'HorizontalAlignment'

Комментирование строки Slider приводит к компилируемому и запускаемому коду.

Как бы один совершил sh это?

1 Ответ

1 голос
/ 02 марта 2020

Самое быстрое решение - использовать привязку обертки, как показано на снимке ниже

Slider(value: Binding<Double>(
    get: { self.appData.dataPoints[self.dataPointID]?.value ?? 0 },
    set: { self.appData.dataPoints[self.dataPointID]?.value = $0}), in: 0...10000)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...