Home > Net >  Propertly break down and pass data between views
Propertly break down and pass data between views

Time:11-05

So I'm still learning Swift and I wanted to cleanup some code and break down views, but I can't seem to figure out how to pass data between views, so I wanted to reach out and check with others.

So let's say that I have MainView() which previously had this:

struct MainView: View {
    @ObservedObject var model: MainViewModel
    
    if let item = model.selectedItem {
        HStack(alignment: .center, spacing: 3) {
            Text(item.title)
        }
    }
}

Now I created a SecondView() and changed the MainView() content to this:

struct MainView: View {
    @ObservedObject var model: MainViewModel
    
    if let item = model.selectedItem {
        SecondView(item: item)
    }
}

Inside SecondView(), how can I access the item data so that I can use item.title inside SecondView() now?

CodePudding user response:

In order to pass item to SecondView, declare item as a let property and then when you call it with SecondView(item: item), SecondView can refer to item.title.

Here is a complete example expanding on your code:

import SwiftUI

struct Item {
    let title = "Test Title"
}

class MainViewModel: ObservableObject {
    @Published var selectedItem: Item? = Item()
}

struct MainView: View {
    @ObservedObject var model: MainViewModel
 
    var body: some View {
        if let item = model.selectedItem {
            SecondView(item: item)
        }
    }
}

struct SecondView: View {
    let item: Item
    
    var body: some View {
        Text(item.title)
    }
}

struct ContentView: View {
    @StateObject private var model = MainViewModel()
    
    var body: some View {
        MainView(model: model)
    }
}
  • Related