Swiftui 如何使用完成处理程序[SWIFT UI]填写列表

Swiftui 如何使用完成处理程序[SWIFT UI]填写列表,swiftui,completionhandler,swift5.2,mutating-function,Swiftui,Completionhandler,Swift5.2,Mutating Function,我想用一个完成处理程序来填充一个列表,问题是它在第一次执行时加载了nil,并且在我试图使用我的视图时标记了错误,我的列表是由完成处理程序填充的。。。有什么建议可以解决这个问题吗 这就是我试图填写清单的方式 let invitationService: InvitationService = InvitationService() @State private var invitationsList : [Appointment]? init() { let defaults = Use

我想用一个完成处理程序来填充一个列表,问题是它在第一次执行时加载了nil,并且在我试图使用我的视图时标记了错误,我的列表是由完成处理程序填充的。。。有什么建议可以解决这个问题吗

这就是我试图填写清单的方式

let invitationService: InvitationService = InvitationService()
@State private var invitationsList : [Appointment]?

init() {
    let defaults = UserDefaults.standard
    let userId = defaults.integer(forKey: "userId")
    var appointmentList : [Appointment]?

    invitationService.getInvitations(id: userId, completionHandler: { (appointment) in
        if appointment != nil{
            appointmentList = appointment
        }
    })

    _invitationsList = State<[Appointment]?>.init(initialValue: (appointmentList))
}
我的看法

var body: some View {
    NavigationView{

    ZStack{
        colors["LightGray"]?.edgesIgnoringSafeArea(.all)
        Text("Hey").onAppear(){
            let defaults = UserDefaults.standard
                                   let userId = defaults.integer(forKey: "userId")

                                   self.invitationService.getInvitations(id: userId) { (appointment) in
                                       self.invitationsList = appointment

                                   }
        }
        List {

            ForEach(invitationsList!, id: \.self){invitation in
                NavigationLink(destination: InvitationDetailView(invitation: invitation)){
                    HStack{
                        VStack(alignment: .center){
                            Text(invitation.startDate.prefix(2))
                                .font(.largeTitle)
                            Text(invitation.startDate[2..<6]).font(.subheadline)

                        }.padding()
                        Spacer().frame(width:UIScreen.main.bounds.width/15, alignment: .leading)

                        ImageView(withURL: invitation.imageProfile,widthValue: 80, heightValue: 80)
                            .aspectRatio(contentMode: .fit)
                            .clipShape(Circle())
                        Spacer()
                        VStack(alignment: .leading){
                            Text(invitation.titleVisit)
                                .font(.headline)
                                .frame(width: UIScreen.main.bounds.width/3, alignment: .leading)
                            Text(invitation.typeVisit)
                                .font(.footnote)
                            Text(invitation.startDate.suffix(9))
                                .font(.caption)
                        }.padding()
                    }
                    .background(self.colors["White"])
                    .cornerRadius(25)
                    .foregroundColor(self.colors["Black"])
                    .shadow(radius: 2, x: 0, y: 0)
                }



            }.onDelete(perform: delete)



        }


    }.hideNavigationBar(text: "back".localized)
}

}
var主体:一些视图{
导航视图{
ZStack{
颜色[“浅灰色”]?.边缘识别安全区域(.all)
文本(“嘿”).onAppear(){
让defaults=UserDefaults.standard
让userId=defaults.integer(forKey:“userId”)
中的self.invitationService.getInvitations(id:userId){(约会)
self.invitationlist=预约
}
}
名单{
ForEach(invitationsList!,id:\.self){invitation in
导航链接(目的地:InvitationDetailView(邀请:邀请)){
HStack{
VStack(对齐:。中心){
文本(邀请.开始日期.前缀(2))
.font(.largeTitle)

Text(invitation.startDate[2..我建议不要将此类内容放入
View.init
,因为SwiftUI视图是结构、值,可以在布局/渲染期间多次重新创建。更好的方法是在视图出现后执行此操作(或者更好的是,在视图层次结构之外)

无论如何,在这里看到是可能的方法

...
let invitationService: InvitationService = InvitationService()
@State private var invitationsList : [Appointment]? = nil

// nothing for init in this case

var body: some View {
    Text("Any subview here")
    .onAppear {
       let defaults = UserDefaults.standard
       let userId = defaults.integer(forKey: "userId")

       self.invitationService.getInvitations(id: userId) { (appointment) in
           self.invitationsList = appointment
       }
    }
}

我建议不要将这些内容放入
视图.init
,因为SwiftUI视图是结构、值,并且可以在布局/渲染期间多次重新创建。更好的方法是在视图出现后执行此操作(或者更好的是,在视图层次结构之外)

无论如何,在这里看到是可能的方法

...
let invitationService: InvitationService = InvitationService()
@State private var invitationsList : [Appointment]? = nil

// nothing for init in this case

var body: some View {
    Text("Any subview here")
    .onAppear {
       let defaults = UserDefaults.standard
       let userId = defaults.integer(forKey: "userId")

       self.invitationService.getInvitations(id: userId) { (appointment) in
           self.invitationsList = appointment
       }
    }
}

它没有使用我的方法:c。我完全同意你所说的,但它不是从“出现”开始的。我将更新以更好地向你解释。我的列表似乎为零并出现错误。我真的不知道如何修复it@AntonioLabra,请尝试使用ForEach(邀请列表???[],id:\.self)如果邀请函列表!=nil
,或者将整个列表置于条件
,因为在响应之前,没有任何东西可以显示。这不是使用我的方法:c.我完全同意你所说的,但它不是从“出现”开始的.我将更新以更好地向您解释。我的列表似乎为零并出现错误。我真的不知道如何修复it@AntonioLabra,请尝试使用
ForEach(invitationlist???[],id:\.self).
或将整个列表置于条件
中(如果invitationlist!=nil
),因为在响应之前,实际上没有任何内容可显示。