Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI视图生命周期,重新意大利化_Swift_Swiftui - Fatal编程技术网

SwiftUI视图生命周期,重新意大利化

SwiftUI视图生命周期,重新意大利化,swift,swiftui,Swift,Swiftui,我正在努力解决视图生命周期和快速视图重用问题 在本例中,我的视图可以使用不同的id重新初始化,然后必须异步显示用户名。我以前在OnAppear中运行loadData函数,但是在第一次加载之后它不会重新初始化。然而,现在我添加了init函数,我的状态和视图在任何init上都没有更新 struct TestView: View { @State var userName : String = "" init(id: Int){

我正在努力解决视图生命周期和快速视图重用问题

在本例中,我的视图可以使用不同的id重新初始化,然后必须异步显示用户名。我以前在OnAppear中运行loadData函数,但是在第一次加载之后它不会重新初始化。然而,现在我添加了init函数,我的状态和视图在任何init上都没有更新

struct TestView: View {
    
    @State var userName : String  = ""
    
    init(id: Int){
        print("Init \(id)")
        loadData(id: id)
    }
    
    var body: some View {
        VStack{
            if userName != "" {
                Text(userName)
            }
        }
    }
    
    // function that will return username at some point in the future
    private func loadData(id: Int){
        let Obs: Observable<String> = manager.getUser(id: id)
               
       Obs.subscribe(onNext: { user in
            self.userName = user.userName
       })
    }
}
struct TestView:View{
@状态变量userName:String=“”
init(id:Int){
打印(“初始化\(id)”)
loadData(id:id)
}
var body:一些观点{
VStack{
如果用户名!“”{
文本(用户名)
}
}
}
//函数,该函数将在将来的某个时间返回用户名
私有函数加载数据(id:Int){
让Obs:Observable=manager.getUser(id:id)
Obs.subscribe(onNext:{user in
self.userName=user.userName
})
}
}

视图未重建,因为在提供的变量中,它被解释为相等(因为未存储不同的属性)

试试下面的方法

struct TestView: View {
    let id: Int            // << changing this should make view rebuild
    @State private var userName : String  = ""
    
    var body: some View {
        VStack{
            if userName != "" {
                Text(userName)
            }
        }
        .onAppear {
            print("Rebuild with: \(id)")
            loadData(id: id)
        }
        .id(self.id)     // << Update: this one !!
    }
    
    // function that will return username at some point in the future
    private func loadData(id: Int){
        let Obs: Observable<String> = manager.getUser(id: id)
               
       Obs.subscribe(onNext: { user in
            self.userName = user.userName
       })
    }
}
struct TestView:View{

let id:Int//使用onAppear的问题是它只运行一次,如果父视图将id更改为另一个值,它不会重新初始化:SetID为1,Rebuild为:1,SetID为2…..没有重新生成