Как заполнить список с помощью обработчиков завершения [SWIFT UI] - PullRequest
1 голос
/ 30 апреля 2020

Я хочу заполнить список с помощью обработчика завершения, проблема в том, что он загружает ноль при первом выполнении и помечает ошибки, когда я пытаюсь использовать мой View, где у меня есть список, который заполнен обработчиком завершения ... Любой предложения, чтобы это исправить?

так я пытаюсь заполнить свой список

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))
}

, как вы видите, мне нужно будет заполнить свой список до тех пор, пока InvitationService запрос не закончится, но если я попытаюсь чтобы поместить это в код, я получил

Выход из закрытия захватывает изменяющийся параметр 'self'

ошибка

Я имею в виду

  invitationService.getInvitations(id: userId, completionHandler: { (appointment) in
            if appointment != nil{
                appointmentList = appointment
                self._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)
}

}

Я пытаюсь выполнить, и когда я это делаю, invitationsList равен нулю

1 Ответ

0 голосов
/ 30 апреля 2020

Я рекомендую не помещать такие вещи в 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
       }
    }
}
...