SwiftUI привязка даты TextField - PullRequest
       26

SwiftUI привязка даты TextField

0 голосов
/ 11 февраля 2020

Хммм. Я не очень хорошо справляюсь с этими привязками.

struct RecordForm: View
{
    @State var record: Record
    var body: some View
    {
        TextField("date", text: Binding($record.recordDate!)))
    }
}

Я хочу преобразовать эту дату в строку. В обычном Swift я бы просто назвал свое расширение

record.recordDate.mmmyyy()

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

Если я попытаюсь поместить код в Тело или структура Я просто получаю кучу ошибок.

Есть ли какая-либо легкая для чтения документация по этому вопросу?

Ответы [ 2 ]

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

Ответ из девяти камней сработал хорошо, хотя мне пришлось немного подправить код, чтобы заставить его работать для меня с NSManagedObject:

struct RecordDate: View
{
    @State var record: Record //NSManagedObject
    var body: some View {
        let bind = Binding<String>(
            get: {self.$record.recordDate.wrappedValue!.dateString()},
            set: {self.$record.recordDate.wrappedValue = dateFromString($0)}
        )
        return HStack {
            Text("Date:")
            TextField("date", text: bind)
        }
    }
}

//dateString is a date extension that returns a date as a string
//dateFromString is a function that returns a string from a date
1 голос
/ 11 февраля 2020

Документацию сложно найти, и Apple действительно пользуется этим.

Попробуйте создать пользовательскую привязку.

extension Date {
  func mmyyy() -> String { "blah" }
  static func yyymm(val: String) -> Date { Date() }
}

struct RecordForm: View {
  struct Record {
    var recordDate: Date
  }

  @State var record = Record(recordDate: Date())
  var body: some View {
    let bind = Binding(
      get: { self.record.recordDate.mmyyy() },
      set: { self.record.recordDate = Date.yyymm(val: $0)}
    )
    return VStack {
      TextField("date", text: bind)
    }
  }
}
...