如何在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