One way would be passing manager as well as model:
class ModelManager: ObservableObject {
static let shared = ModelManager()
@Published var modelList = Model.testData
func previous(for model: Model) - Model? {
if let index = modelList.firstIndex(where: {$0.modelValue == model.modelValue}) {
if index 0 {
return modelList[index - 1]
}
}
return nil
}
func next(for model: Model) - Model? {
if let index = modelList.firstIndex(where: {$0.modelValue == model.modelValue}) {
if index modelList.count - 1 {
return modelList[index + 1]
}
}
return nil
}
}
struct ContentView: View {
@StateObject var manager: ModelManager = ModelManager.shared
var body: some View {
NavigationView {
List(manager.modelList) { object in
NavigationLink(
destination: DetailView(manager: manager, model: object),
label: {
Text("fred \(object.modelValue)")
})
}
}
}
}
struct DetailView: View {
@ObservedObject var manager: ModelManager
@State var model: Model
var body: some View {
VStack {
HStack {
if let previous = manager.previous(for: model) {
Button("Previous") {
model = previous
}
}
Spacer()
if let next = manager.next(for: model) {
Button("Next") {
model = next
}
}
}
Text("value: \(model.modelValue)")
Spacer()
}
}
}
Topic:
UI Frameworks
SubTopic:
SwiftUI
Tags: