Apologies if this seems a bit basic, but I really don't understand what the best practice is for solving this problem. I have tried saving the selected house in UserDefaults then checking to see if the selected house has changed using the .viewDidAppear{} callback. This works, but is definitely hacky and has side effects. Basically what I want to happen is when the user selects a house using HouseViewModel, the RoomsViewModel should trigger loadRoomsForHouse(selectedHouse) and show the correct String.
import SwiftUI
struct HomeView: View {
var body: some View {
TabView {
RoomsView().tabItem {
Label("Rooms", systemImage: "pencil")
}
HousePickerView().tabItem {
Label("House Picker", systemImage: "magnifyingglass")
}
}
}
}
struct RoomsView: View {
@StateObject var roomsViewModel = RoomsViewModel()
var body: some View {
NavigationStack {
VStack {
Text("Rooms:")
Text(roomsViewModel.roomsBasedOnHouse)
}
}
}
}
struct HousePickerView: View {
@StateObject var homeViewModel = HousePickerViewModel()
var body: some View {
NavigationStack {
VStack {
List(homeViewModel.houses) { house in
HStack {
if(house.id == homeViewModel.selectedHouse?.id) {
Image(systemName: "checkmark")
}
Text(house.name)
}.onTapGesture {
homeViewModel.pickHouse(house: house)
}
}
}
}
}
}
class RoomsViewModel: ObservableObject {
@Published var roomsBasedOnHouse: String = ""
// ******************************************************************************
// here is where I want to listen for when a different house is selected and call
// loadRoomsForHouse(selectedHouse) to update the string
// ******************************************************************************
func loadRoomsForHouse(house: House) {
if(house.name == "Home") {
roomsBasedOnHouse = "Living Room, Bedroom, Garage"
} else if (house.name == "Vacation Home"){
roomsBasedOnHouse = "Patio, Pool Room, Bar"
}
}
}
class HousePickerViewModel: ObservableObject {
@Published var houses = [House](arrayLiteral: House(id: "abc", name: "Home"), House(id: "def", name: "Vacation Home"))
@Published var selectedHouse: House? = nil
func pickHouse(house: House) {
selectedHouse = house
}
}
public struct House: Identifiable {
public var id : String
public var name: String
}
struct HomeView_Previews: PreviewProvider {
static var previews: some View {
HomeView()
}
}