我想上传像pdf或jpg这样的文件到我的Firebase,并更新我的Collection ‘solde’,它存储来自元素ID的所有数据.我的前脸是这样的:

//
//  UserSolde.swift
//  ML2V_IOS
//
//  Created by Clément Enjolras on 05/09/2023.
//

import SwiftUI
import FirebaseStorage
import UIKit
import MobileCoreServices

struct UserSolde: View {
    @EnvironmentObject var viewModel: AuthViewModel
    @StateObject var soldemodel = SoldeModel()
    @State private var soldes: [Solde] = []
    @State private var isDocumentPickerPresented = false
    @State private var selectedURL: URL?
    @State private var selectedSoldeID: String? = nil
    
    var body: some View {
        content.onAppear{
            Task{
                do{
                    try await soldemodel.getAllSolde()
                    soldes = soldemodel.resultsolde
                }catch{
                    print("Erreur lors de la récupération des soldes : \(error)")
                }
            }
        }
    }
    
    var content: some View{
        VStack{
            HStack{
                Text("Mes Soldes").font(.system(size: 24).bold())
                Spacer()
                Image(systemName: "creditcard")
                    .font(.system(size: 32))
                    .foregroundColor(.black)
                    .frame(width: 32, height: 32)
                    .background(Color(.white))
            }.padding(.horizontal)
            
            List($soldes){ solde in
                
                HStack{
                    VStack{
                        Text("Total du solde en cours").font(.system(size: 14)).multilineTextAlignment(.center)
//error here
                        Text("\(solde.total)").padding(.top,5).font(.system(size: 12)).foregroundColor(.gray).multilineTextAlignment(.center)
                    }
                    Spacer()
                    VStack{
                        Text("Etat de la demande").font(.system(size: 14)).multilineTextAlignment(.center)
//same error here
                        Text("\(solde.etat)").padding(.top,5).font(.system(size: 12)).foregroundColor(.gray).multilineTextAlignment(.center)
                    }
                    Spacer()
                    VStack{
                        Text("Date d'émission").font(.system(size: 14)).multilineTextAlignment(.center)
//also here
                        Text("\(solde.date)").padding(.top,5).font(.system(size: 12)).foregroundColor(.gray).multilineTextAlignment(.center)
                    }
                    Spacer()
                    Button {
                        selectedSoldeID = solde.id
                        isDocumentPickerPresented.toggle()
                            } label: {
                                Text("Envoyer la facture").multilineTextAlignment(.center)
                            }.sheet(isPresented: $isDocumentPickerPresented) {
                                
                                DocumentPickerView(selectedURL: $selectedURL,soldeDataId:$selectedSoldeID)
                            }
                }
            }
            
            Button {
                
            } label: {
                HStack{
                    Text("DEMANDER MON SOLDE").fontWeight(.semibold)
                    Image(systemName: "arrow.right")
                    
                }.foregroundColor(.white)
                    .frame(width: UIScreen.main.bounds.width - 32, height: 48)
            }.background(Color(.systemBlue)).cornerRadius(10).padding(.top,24)
            
        
            NavigationLink {
                UserDashboard().navigationBarBackButtonHidden(true)
            } label: {
                HStack(spacing: 3){
                    Text("Retour à la page")
                    Text("Principale").fontWeight(.bold)
                }.font(.system(size: 14))
            }
        }
    }
}

private func formatDate(_ date: Date) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/yyyy"
    return dateFormatter.string(from: date)
}

//Mettre à jour firestore et firebase avec la facture
func uploadInvoice(url:String,iddocument:String,filename:String){

}

struct DocumentPickerView: UIViewControllerRepresentable {
    @Binding var selectedURL: URL?
    @Binding var soldeDataId: String?

    func makeUIViewController(context: Context) -> some UIViewController {
        let controller = UIDocumentPickerViewController(forOpeningContentTypes: [.png,.pdf,.jpeg,], asCopy: true)
        controller.delegate = context.coordinator
        return controller
    }

    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
        // No update needed
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, UIDocumentPickerDelegate {
        let parent: DocumentPickerView

        init(_ parent: DocumentPickerView) {
            self.parent = parent
        }

        func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
            if let selectedURL = urls.first {
                parent.selectedURL = selectedURL
            }
        }
    }
}

struct UserSolde_Previews: PreviewProvider {
    static var previews: some View {
        UserSolde()
    }
}

目标是将我的文件与我的Firebase链接起来.为了实现这一点,我想存储我的solde id,就像我已经做的那样,但是当我在我的docupicker中存储$seltedsoldeid时,我得到了这个错误:在对实例方法‘appendInterpolation’的调用中没有精确匹配. 我是Swift 的新手,你能解释一下为什么吗?一旦我拿到我的‘士兵’的身份证,我就会没事的

我已经多次try 更改我的代码,但问题是传递id来修改我的集合和链接数据

推荐答案

您拨打的是List中的this initialiser.请注意,它需要类型为(Binding<Solde>) -> RowContent的闭包.

这意味着solde闭合参数是Binding<Solde>.solde.totalsolde.date等都是Binding<Int>Binding<Date>等类型.Text的自定义字符串内插不支持这些类型.在任何情况下,您的意图都是对IntDate值进行内插,而不是绑定.

只需访问这些绑定中的wrappedValue个即可获得IntDate等.

示例:

Text("\(solde.total.wrappedValue)")

Swift相关问答推荐

自定义完整屏幕封面动画

动画过程中的SwiftUI重绘视图

并发访问SWIFT中数组的非重叠子范围

如何使用变量 Select 哪个向量(?)在我的 struct 中密谋吗?

正在接收具有不完整数据错误的URL请求

在扩展中创建通用排序函数

如何在 SwiftUI 中创建条件内容?

@Binding 在@StateObject 和 View 上被发布了两次?

如何从数据中读取以空结尾的字符串?

按钮图像不会立即刷新

关联满足约束时的快速协议方法

响应 UITextField (UIViewRepresentable) 中的特定按键

我如何从 UIAlertController 导航到新屏幕(swiftUI)

用于 Swift 编码的 iOS 应用程序的 Ffmpeg

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

在 Swift 中计算两个日期之间的差异

让我的函数计算数组 Swift 的平均值

NSFontAttributeName 已更改为 String

Swift 动画 WithDuration 语法是什么?

滑动侧边栏菜单 IOS 8 Swift