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