SwiftUI:Model 与 TextField 视图不兼容。

3

我有这个用于我的模型的简单代码:

import Foundation
class TaskListModel: ObservableObject
{
    struct TodoItem: Identifiable
    {
        var id = UUID()
        var title: String = ""
    }
    @Published var items: [TodoItem]?
    
    //MARK: - intents
    func addToList()
    {
        self.items!.append(TodoItem())
    }
}

然后我在这个视图中使用它:

import SwiftUI
struct TasksListView: View {
    @ObservedObject var model = TaskListModel()
    var body: some View {
        List {
            Button("Add list", action: {
                model.addToList()
            })
            ForEach(model.items!) { item in
                TextField("Title", text: item.title)
                }
            .onMove { indexSet, offset in
                model.items!.move(fromOffsets: indexSet, toOffset: offset)
            }
            .onDelete { indexSet in
                model.items!.remove(atOffsets: indexSet)
            }
        }
    }
}

struct TasksListView_Previews: PreviewProvider {
    static var previews: some View {
        TasksListView()
    }
}

我似乎无法让这段代码工作起来,我怀疑items数组需要用@Binding属性包装器进行包装,但它已经用@Published进行了包装,所以这更令我困惑。任何帮助将不胜感激!


1
你应该使用@StateObject而不是@ObservedObject。关于为什么,请阅读这里获取更多信息:https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app - CouchDeveloper
谢谢,这份文档真的很有帮助! - Pavlo Kupyn
1个回答

2

您忘记为项目创建数组

class TaskListModel: ObservableObject
{
    struct TodoItem: Identifiable
    {
        var id = UUID()
        var title: String = ""
    }
    @Published var items: [TodoItem] = []     // << here !!

// ...
}

并且删除所有的强制解包 (!!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接