如何在SwiftUI中更新列表?

如何在SwiftUI中更新列表?,swiftui,Swiftui,我的代码比这个复杂一点,所以我创建了一个示例,得到了相同的错误 当我导航到一个视图时,我有一个函数,我想用传递到这个视图中的变量来执行。然后,该函数生成一个数组。然后我想把这个数组放到一个列表中,但是我得到了一个错误 如何获取列表以显示生成的数组 我认为问题在于列表无法更新,因为它已经声明了空数组 struct ContentView : View { @State var array = [String]() var body: some View { Li

我的代码比这个复杂一点,所以我创建了一个示例,得到了相同的错误

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

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

我认为问题在于列表无法更新,因为它已经声明了空数组

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"]
    }

}
愚蠢的用户界面是一个好的用户界面

保持视图为哑巴尝试以下代码创建动态列表


导入UIKit
导入快捷键
导入PlaygroundSupport
结构ContentView:View{
@状态变量数组=[String]()
var body:一些观点{
名单{
ForEach(array.identified(by:\.self)){item in
文本(“\(项目)”)
}
}
}
}
func createArrayItems()->[字符串]{
返回[“项目1”、“项目2”、“项目3”、“项目4”、“项目5”、“项目6”]
}
PlaygroundPage.current.liveView=UIHostingController(根视图:ContentView(数组:createArrayItems()))

您可以使用联合收割机框架来更新列表。 每当对DataProvider对象进行更改时,它将自动更新列表

struct ContentView:View{
@环境对象变量数据:数据提供程序
var body:一些观点{
导航视图{
导航按钮(目标:SecondPage()){
文本(“转到第二页”)
}
名单{
ForEach(data.array.identified(by:\.self)){item in
文本(“\(项目)”)
}
}
}
}
}
在列表中添加项目

struct第二页:查看{
@状态变量计数器=1
@EnvironmentObject变量tempArray:数据提供程序
var body:一些观点{
VStack{
按钮(操作:{
self.tempArray.array.append(“item\(self.counter)”)
self.counter+=1
}) {
文本(“添加项目”)
}
文本(“添加的项目数量\(计数器1)”)
}
}
}
它只会通知更改

导入联合收割机
最终类数据提供程序:BindableObject{
让didChange=PassthroughSubject()
变量数组=[String](){
迪塞特{
发送(自我)
}
}
}
您还需要在SceneDelegate中进行一些更新。此更新确保ContentView在环境中具有DataProvider对象

window.rootViewController=UIHostingController(rootView:ContentView().environmentObject(DataProvider()))
@txagPman

我也有你的问题,无法理解如何修改列表。 我能写这段代码。 我希望它有用

    import SwiftUI

struct ContentView: View {

    @State private var array = createArrayItems()
    //     @State private var array = [""] - This work
    //    @State private var array = [] - This not work
    @State private var text = ""

    var body: some View {
        VStack {
            TextField("Text", text: $text, onCommit: {
//                self.array = createArrayItems() - This work after press return on textfield
                self.array.append(self.text)
            }).padding()
            List (self.array, id: \.self) {item in
                Text("\(item)")
            }
        }
//        .onAppear {
//            self.array = createArrayItems() - This not work
//        }
    }
}

func createArrayItems() -> [String] {
    return ["item_01","item_02","item_03","item_04" ]
}

您可以使用带有@Published属性的observeObject数据提供程序(例如:ViewModel)

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")
   }
}
使用以下命令:

class ObservableArray<T>: ObservableObject {
  @Published var array: [T]
  init(array: [T] = ) {
     self.array = array
  }
  init(repeating value: T, count: Int) {
     array = Array(repeating: value, count: count)
  }
}

struct YourView: View {
  @ObservedObject var array = ObservableArray<String>()
  var body: some View {
      
  }
}
类ObservalArray:ObservaleObject{
@已发布的变量数组:[T]
初始化(数组:[T]=){
self.array=array
}
init(重复值:T,计数:Int){
数组=数组(重复:值,计数:计数)
}
}
structYourView:View{
@ObservedObject变量数组=ObservableArray()
var body:一些观点{
}
}
标识(由:)不再可用(Xcode 11.1 GM Seed)。更改为id:\.self或id:\.id