绑定一个可选

spe*_*peg 1 ios swift swiftui

我得到了一个可选日期,并希望能够为其显示日期选择器。

import SwiftUI


struct ContentView: View {
    @State var someDate: Date?

    var body: some View {
        OptionalDate(date: $someDate)
    }
}

struct OptionalDate: View {
    @Binding var date: Date?

    var body: some View {

        if date == nil {
            return Text("No date").onTapGesture {
                self.date = Date()   // start picking!
            }
        } else {
            return DatePicker(selection: $date, displayedComponents: .date) {
                Text("Due Date")
            }
        }
    }
}

Run Code Online (Sandbox Code Playgroud)
Cannot convert value of type 'Binding<Date?>' to expected argument type 'Binding<Date>'
Run Code Online (Sandbox Code Playgroud)

更不用说我将不得不弄清楚不透明的视图......

Cun*_*eyt 5

iOS 13

自定义绑定是您的朋友!此外,对于条件视图,您始终可以使用Group,这将使您的生活更轻松,并且将解决Opaque问题,因为它始终被视为Group您拥有的任何子视图。

struct OptionalDateView: View {
    
    @Binding var date: Date?

    var body: some View {
        Group {
            if date == nil {
                Text("No date").onTapGesture {
                    self.date = Date()
                }
            } else {
                DatePicker(selection: dateBinding, displayedComponents: .date) {
                    Text("Due Date")
                }
            }
        }
    }
    
    private var dateBinding: Binding<Date> {
        Binding(get: {
            self.date ?? Date()
        }, set: {
            self.date = $0
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

iOS 14

struct OptionalDateView: View {
    
    @Binding var date: Date?

    var body: some View {
        if date == nil {
            Text("No date").onTapGesture {
                date = Date()
            }
        } else {
            DatePicker(selection: dateBinding, displayedComponents: .date) {
                Text("Due Date")
            }
        }
    }
    
    private var dateBinding: Binding<Date> {
        Binding {
            date ?? Date()
        } set: {
            date = $0
        }
    }
}
Run Code Online (Sandbox Code Playgroud)