Picker count not updating when Array is re-filtered

I have a Category Picker and an Item Picker. When picking a category, it filters the items you can see in the Item picker. Based on excellent input earlier in this Forum, I've managed to get it to work with one small caveat: The count of items doesn't change when you change category.


Have I made a syntax error somewhere, or is my approach completely wrong?


import SwiftUI

// Data
struct Item: Identifiable {
    var id = UUID()
    var category:String
    var item:String
}
let myCategories:[String] = ["Category 1","Category 2"]
let myItems:[Item] = [
    Item(category: "Category 1", item: "Item 1.1"),
    Item(category: "Category 1", item: "Item 1.2"),
    Item(category: "Category 2", item: "Item 2.1"),
    Item(category: "Category 2", item: "Item 2.2"),
    Item(category: "Category 2", item: "Item 2.3"),
    Item(category: "Category 2", item: "Item 2.4"),
]

// Factory
class MyObject: ObservableObject {
    // Category picker variables
    @Published var selectedCategory:String = myCategories[0]
    @Published var selectedCategoryItems:[Item] = []
    @Published var selectedCategoryInt:Int = 0 {
        didSet {
            selectCategoryActions(selectedCategoryInt)
        }
    }
    // Item picker variables
    @Published var selectedItem:Item = myItems[0]
    @Published var selectedItemInt:Int = 0 {
        didSet {
            selectedItem = selectedCategoryItems[selectedItemInt]
        }
    }
    // Initial category selection
    init() {
        selectCategoryActions(selectedCategoryInt)
    }
    // Actions when selecting a new category
    func selectCategoryActions(_ selectedCategoryInt:Int) {
        selectedCategory = myCategories[selectedCategoryInt]
        // Get items in category
        selectedCategoryItems = myItems.filter{ $0.category.contains(selectedCategory)}
        // Select initial item in category
        let selectedItemIntWrapped:Int? = myItems.firstIndex { $0.category == selectedCategory }
        if let selectedItemInt = selectedItemIntWrapped {
            self.selectedItem = myItems[selectedItemInt]
        }
    }
}

// View
struct ContentView: View {
    @ObservedObject var myObject = MyObject()
    
    var body: some View {
            VStack(spacing: 10) {
                Section(header: Text("Observable Object")) {
                    Text("Category 2 has four items, but only the first two are shown.")
                    Text("Selected category: \(myObject.selectedCategory)")
                    Text("Items in category: \(myObject.selectedCategoryItems.count)")
                    Text("Selected item: \(myObject.selectedItem.item)")
                    Picker(selection: self.$myObject.selectedCategoryInt, label: Text("Select category")) {
                        ForEach(0 ..< myCategories.count, id: \.self) {
                            Text("\(myCategories[$0])")
                        }
                    }.labelsHidden()
                    // MARK: Something is going wrong here. The count doesn't update after picking a new category.
                    Picker(selection: self.$myObject.selectedItemInt, label: Text("Select object item")) {
                        ForEach(0 ..< self.myObject.selectedCategoryItems.count, id: \.self) {
                            Text("\(self.myObject.selectedCategoryItems[$0].item)")
                        }
                        /*ForEach(selectedCategoryItems, id: \.id) { item in
                         Text("\(item.content)")
                         }*/
                    }.labelsHidden()
                }
                Spacer()
            }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Picker count not updating when Array is re-filtered
 
 
Q