如何在 SwiftUI 中更新列表?

txa*_*man 11 swiftui

我的代码比这稍微复杂一些,所以我创建了一个出现相同错误的示例。

当我导航到一个视图时,我有一个函数,我想用传递给这个视图的变量来执行。然后该函数生成一个数组。然后我想将该数组放入一个列表中,但出现错误。

如何获取列表以显示生成的数组?

我认为问题是 List 无法更新,因为它已经有声明的空白数组。

struct ContentView : View {

    @State var array = [String]()

    var body: some View {
        List(self.array,id: \.self) { item in
            Text("\(item)")
            }
            .onAppear(perform: createArrayItems)
    }

    func createArrayItems() {
        array = ["item1", "item2", "item3", "item4", "item5"]
    }

}
Run Code Online (Sandbox Code Playgroud)

小智 13

您可以将 ObservableObject 数据提供程序(例如:ViewModel)与 @Published 属性一起使用。

struct ListView: View {
   @ObservedObject var viewModel = ListViewModel()

   var body: some View {
      NavigationView {
         List(){
            ForEach(viewModel.items) { item in
               Text(item)
            }
         }
      }  
   }
}



#if DEBUG

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
     ListView()
  }
}
#endif



class ListViewModel: ObservableObject {

   @Published var items = ["item1", "item2", "item3", "item4", "item5","item6"]

   func addItem(){
      items.append("item7")
   }
}
Run Code Online (Sandbox Code Playgroud)


Imr*_*ran 0

愚蠢的 UI 也是好的 UI

让你的观点保持愚蠢尝试以下代码来创建动态列表


import UIKit
import SwiftUI
import PlaygroundSupport

struct ContentView : View {
    @State var array = [String]()
    var body: some View {
                List{
                    ForEach(array.identified(by: \.self)) { item in
                    Text("\(item)")
                }
            }
        }
    }

func createArrayItems()->[String] {
    return ["item1", "item2", "item3", "item4", "item5","item6"]
}

PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView(array: createArrayItems()))
Run Code Online (Sandbox Code Playgroud)

  • 已识别(作者:)不再可用(Xcode 11.1 GM Seed)。更改为 id: \.self 或 id: \.id (2认同)