Формат валюты ввода SwiftUI в текстовом поле (справа налево) - PullRequest
1 голос
/ 29 марта 2020

У меня есть текстовое поле со значением по умолчанию 0,00

Когда пользователь нажимает 1. Текстовое поле должно отображать 0,01

Когда пользователь нажимает 2. В текстовом поле должно отображаться 0,12

Когда пользователь нажимает 3. В текстовом поле должно отображаться 1,23

Когда пользователь нажимает 4. В текстовом поле должно отображаться 12,34

Кто-нибудь делал это с SwiftUI?

Ответы [ 3 ]

0 голосов
/ 29 марта 2020

попробуйте

import SwiftUI

class Model: ObservableObject {
    @Published var txt = ""
    var value: Double {
        (Double(self.txt) ?? 0.0) / 100
    }
}

struct ContentView: View {
    @ObservedObject var model = Model()
    var body: some View {
        let binding = Binding<String>(get: { () -> String in
            return String(format: "%.2f", self.model.value)
        }) { (s) in
            var s = s
            s.removeAll { (c) -> Bool in
                !c.isNumber
            }
            self.model.txt = s
        }
        return TextField("0.00", text: binding).keyboardType(.numbersAndPunctuation)
            .padding()
            .border(Color.red)
    }
}

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

вот результат

enter image description here

0 голосов
/ 05 мая 2020

Я создал currencyTextField, который оборачивается вокруг поля UIText. Это не справа налево, но вы можете изменить его, удалив код курсора.

Вот демо

enter image description here

и вот репо https://github.com/youjinp/SwiftUIKit

0 голосов
/ 29 марта 2020

Идея состоит в том, чтобы использовать какой-то собственный прокси для форматирования текста на лету:

struct ContentView: View {
    @State var someNumber = 123

    var body: some View {
        let formattedNumber = Binding<String>(
            get: {
                switch self.someNumber {
                case ..<0: return "???"
                case ..<10: return "0.0\(self.someNumber)"
                case ..<100: return "0.\(self.someNumber)"
                case 100...: return String(format: "%02f", Double(self.someNumber)/100)
                default: return "???"
                }
        },
            set: {
                if let value = NumberFormatter().number(from: $0) {
                    self.someNumber = value.intValue
                }
            }
        )

        return TextField("Number", text: formattedNumber)
      }
}

Предупреждение : Этот ответ содержит некоторые проблемы с UX, когда пользователь вводя текст, но он отвечает на исходный вопрос

Рекомендация : для текстовых полей этого типа я рекомендую использовать пользовательский ответчик, который отвечает на события клавиатуры и текста вместо значений по умолчанию TextField

...