SwiftUI 重新加载视图

ufo*_*oro 9 swiftui

我有一个结构,它从 CoreData 中洗牌和列出记录。我想用按钮重新加载/刷新列表视图。我尝试使用 Button 中的函数。有没有办法做到这一点?

    var body: some View {


            VStack {

                       List {

                           ForEach(dictionary.shuffled().prefix(upTo: 10),id: \.self) { word in


                            HStack {
                               Text("\(word.englishWord)")
                                    .foregroundColor(Color.blue)

                                Text("| \(word.urhoboWord) |")
                                    .foregroundColor(Color.green)

                                Image(word.imageName)
                                    .resizable()
                                    .frame(width:40, height: 40)


                            }//HStack

                           }//End of ForEach

                        }//End of List

                //Button to reload and shuffle list
                Button(action: {}) {

                    Text("Shuffle")
                        .padding()
                        .background(Color.black)
                        .foregroundColor(Color.white)
                        .cornerRadius(6)
                }


                        .navigationBarTitle(Text("Begin Learning"),displayMode: .inline)


Run Code Online (Sandbox Code Playgroud)

Nep*_*Muw 13

@State只需触发或@Published的任何值@ObservableObject。如果没有,只需创建一个:

@State var refresh: Bool = false

func update() {
   refresh.toggle()
}
Run Code Online (Sandbox Code Playgroud)

  • 看来您还需要在视图构建器中使用更新的值,否则更改将被忽略,例如`.background(Color.clear.disabled(refresh))`。 (4认同)
  • 我建议在需要更新的视图上使用`@State private var id = UUID().uuidString`、`.id(id)`修饰符。 (3认同)

Qua*_* Hà 6

您应该将其移动dictionary.shuffled().prefix(upTo: 10)到您ViewModel的视图中,并根据数据重新加载。看看这个代码以供参考:

struct SampleShuffleView : View {
    @ObservedObject var viewModel : ShuffleViewModel = ShuffleViewModel()

    var body : some View {
        VStack {
            List(self.viewModel.listData, id: \.self) { str in
                Text(str)
            }

            Button(action: self.shuffle) {
                Text("Shuffle me").padding()
            }.background(Color.white).padding()

        }
    }

    func shuffle() {
        self.viewModel.shuffle()
    }
}

class ShuffleViewModel : ObservableObject {
    @Published var listData = ["one", "two", "three", "four"]

    func shuffle() {
        listData.shuffle()
        //or listData = dictionary.shuffled().prefix(upTo: 10)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:所有视图的组件将在@ObservedObject更改时重新加载,因此请考虑将较小的视图-视图模型分开,或使用@State变量。

希望这可以帮助。


use*_*734 1

想一想。要在点击时显示数组和随机播放,请完全按照您希望看到的方式进行操作。首先以类似“列表”的方式向我们展示数组,然后根据用户操作对其进行洗牌。

struct ContentView: View {
    @State var arr = ["ALFA", "BETA", "GAMA", "DELTA"]
    var body: some View {
        VStack {
        VStack {
            Divider()
            ForEach(arr, id: \.self) { element in
                VStack {
                    Text(element)
                    Divider()
                }
            }
        }
            Spacer()
            Button(action: {
                self.arr.shuffle()
            }) {
                Text("Shuffle")
            }
            Spacer()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

arr.shuffle()更改了@StateView 并强制 SwiftUI 自动“重新加载它”。