我想用一个完成处理程序来填充一个列表,问题是它在第一次执行时加载的是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))
}
正如你所看到的,我需要填补我的名单,直到 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
为零
我建议不要把这种东西放到 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
}
}
}