SwiftUI: Model doesn't work with the TextField view

Viewed 54

I have this simple code for my model:

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())
    }
}

Then I use it in this view:

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()
    }
}

I can't seem to make this code work, I suspect the items array needs to be wrapped in @Binding property wrapper, but it already wrapped in @Published, so it puzzles me even more. Any help would be appreciated!

1 Answers

You have forgotten to create array for items

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

// ...
}

and remove everywhere force-unwrap (!!)

Related