Получение привязок SwiftUI прямо в пользовательском представлении - PullRequest
1 голос
/ 03 февраля 2020

Я занимаюсь созданием пользовательских представлений для SwiftUI и мне не хватает того, как работают привязки. У меня есть следующий код:

import SwiftUI

struct ContentView: View {
    @State var number: Int = 0

    var body: some View {
        VStack {
            NumberPicker(format: "%02d", max: 20, value: $number)
            Text("You picked \(number)")
        }
    }
}

struct NumberPicker: View {
    var format: String = "%d"
    var max: Int

    @Binding var value: Int

    var valueProxy: Binding<String> {
        Binding<String>(
            get: { String(format: self.format, self.$value.wrappedValue) },
            set: { self.value = Int(String($0))! }
        )
    }

    var body: some View {
        Picker("", selection: valueProxy) {
            ForEach(0..<max) { item in
                Text(String(format: self.format, item))
            }
        }
        .frame(width: 40, height: 175)
        .clipped()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView(number: 5)
    }
}

Когда я запускаю это (в предварительном просмотре или в симуляторе), представление автоматически не выбирает 05 при запуске, как я ожидал. Кроме того, манипулирование средством выбора не обновляет представление Text под ним. Из того, что я прочитал, я чувствую, что это должно сработать, но, может быть, я упускаю что-то очевидное? Или я иду по этому пути неправильно? Это использует Xcode 11.3.1

1 Ответ

1 голос
/ 03 февраля 2020

Проблема в вашем Picker selection значении. Вы должны использовать @Binding var value: Int вместо valueProxy, потому что value вашего NumberPicker вида связан с number вашего ContentView. Поэтому, когда вы измените value, вы также измените number.

Если вы хотите, чтобы Picker начинался с цифры 5, вам нужно начать number с 5 вместо 0.

Код будет выглядеть так:

struct ContentView: View {
    @State var number: Int = 5

    var body: some View {
        VStack {
            NumberPicker(format: "%02d", max: 20, value: $number)
            Text("You picked \(number)")
        }
    }
}
struct NumberPicker: View {
    var format: String = "%d"
    var max: Int

    @Binding var value: Int

    var body: some View {
        Picker("", selection: $value) {
            ForEach(0..<max) { item in
                Text(String(format: self.format, item))
            }
        }
        .frame(width: 40, height: 175)
        .clipped()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...