ios 在SwiftUI中是否有方法将类型从@State日期更改为字符串?

yhived7q  于 2023-01-14  发布在  iOS
关注(0)|答案(2)|浏览(119)

我正在尝试制作一个可以在iPhone上使用的日历应用程序。我正在使用SwiftUI作为应用程序,并使用FirebaseFirestore作为我的数据库。
我正在尝试做的是在一个集合(用户)中创建一个Firestore的文档,并且我希望文档的名称是用户使用日期选择器选择的日期。我已经搜索了关于将日期转换为String的内容,但是当我将其应用于@State变量时,它会发出警报。有什么方法可以解决这个问题吗?
下面是代码:

import SwiftUI

struct SwiftUIView: View {
    @State var date = Date()
    
    var picked = dateToString(date: date, format: "YYYY MM dd")
    
    
    var body: some View {
        DatePicker(
            "Datepicker",
            selection: $date
        )
        .datePickerStyle(.graphical)
    }
    
    
    
    
    
    func dateToString(date: Date, format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
        
        return dateFormatter.string(from: date)
    }
    
}

struct SwiftUIView_Previews: PreviewProvider {
    static var previews: some View {
        SwiftUIView()
    }
}

在带有var picked的行上,出现两个错误:
1.不能在属性初始值设定项中使用示例成员"date";属性初始值设定项在"self"可用之前运行
1.无法在属性初始值设定项中使用示例成员"dateToString";属性初始值设定项在"self"可用之前运行

1cosmwyk

1cosmwyk1#

picked替换为:

var picked: String {
    dateToString(date: date, format: "yyyy MM dd")
}

它应该是一个计算变量。

rnmwe5a2

rnmwe5a22#

在self初始化之前,你不能使用视图的任何变量。这意味着你只能在self可用时使用变量。由于在这种情况下不能这样做,你应该这样做:

struct SwiftUIView: View {
    @State var date = Date()
    @State var picked : String = ""

    var body: some View {
        DatePicker(
            "Datepicker",
            selection: $date
        )
        .datePickerStyle(.graphical)
    }
    // This code will be executed as the view appears
    .onAppear {
        self.picked = self.dateToString(date: date, format: "YYYY MM dd")
    }
    // This code will be executed if the date the user can pick changes
    // If the user changes the date the picked date will also be changed
    .onChange(of: self.date) { newDate in
        self.picked = self.dateToString(date: newDate, format: "YYYY MM dd")
    }

    func dateToString(date: Date, format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = format
    
        return dateFormatter.string(from: date)
    }

}

onChangeOf将确保您的日期作为字符串始终与日期选择器的日期保持最新。
请参阅.onAppear的文档:https://developer.apple.com/documentation/swiftui/view/onAppear(perform:)请参阅.onChangeOf的文档:https://developer.apple.com/documentation/swiftui/view/onchange(of:perform:)
要设置所选的变量,必须使用如下计算变量:

var picked: String {
    dateToString(date: date, format: "YYYY MM dd")
}

相关问题