【问题标题】:Incrementing the variable in a function is creating error while preview (swiftui)在预览时增加函数中的变量会产生错误(swiftui)
【发布时间】:2021-06-15 08:31:02
【问题描述】:

我有这段代码,我在其中调用“makeView”函数来返回一个视图,在 makeView 函数中我递增变量“id”并将其传递给视图,但是当我这样做时它显示这个错误

“从 SongBook.app (2935) 中的 SongsList_Previews 更新预览耗时超过 5 秒。”

令人惊讶的是,当我注释掉“self.id += 1”行时,一切正常。 我是 SwiftUI 新手,如果遗漏了一些信息,请见谅。

struct SongsList: View {
    @State private var id: Int = 0
    var body: some View {
        
        VStack{
            NavigationView {
            List(songs) {
                song in NavigationLink(
                    destination: SongMainView(song: song)) {
                        makeView(song: song)
                    }
            }
        }
    }
        .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
        .background(Color.orange.opacity(0.2))
        .edgesIgnoringSafeArea(.all)
    }
    
    func makeView(song: Song) -> SongsIndexView {
        self.id += 1;
        return SongsIndexView(song: song, id: self.id)
    }
}

【问题讨论】:

    标签: swift swiftui swiftui-list swiftui-navigationlink swiftui-view


    【解决方案1】:

    变量用@State 属性包装器标记。

    @State private var id: Int = 0
    

    每次这个值改变时,SwiftUI 都会尝试更新视图。

    func makeView(song: Song) -> SongsIndexView {
        self.id += 1;
        return SongsIndexView(song: song, id: self.id)
    }
    

    这会导致像 -

    这样的无限循环
    1. id = 1,updateView(但现在是id = 2,因为id += 1
    2. id = 2,updateView(但现在是id = 3,因为id += 1

    你不应该在视图更新时改变状态。

    【讨论】:

    • 嗨,有什么替代方案?我想在每次调用 makeView 时增加“id”变量,并将它传递给 SongsIndexView。
    • 删除@State private var id: Int = 0 声明。从外部传递索引,如makeView(song: Song, index: Int) -> SongsIndexView
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2019-07-29
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多