I use in iOS app NavigationLink in NavigationView (for supporting iOS 15). NavigationView contains list of some items. I would like to use the same view for adding new items and editing exist (after click on NavigationLink). So I need to pass “PersonEntity” to PersonAddOrEditView. This view has 2 init (one with empty params for “add form” and the second one with “PersonEntity” parameter for initialising form fields).
The problem is that I can’t initialise optional fields (vars). They are staying nil and picker (or selectable list in comment) always “choosing” first value(1). It works if I make @State var age: Int?
non-optional.
Thanks in advance for your advices.
import SwiftUI
struct NavigationLinkForm: View {
var persons: [PersonEntity] = [
PersonEntity(name: "Person 1", age: 20),
PersonEntity(name: "Person 2", age: 25),
PersonEntity(name: "Person 3", age: 30),
]
var body: some View {
NavigationView {
VStack {
NavigationLink("Add new person") {
PersonAddOrEditView()
}
List {
ForEach(persons, id: .self) { person in
NavigationLink(person.name) {
PersonAddOrEditView(personEntity: person)
}
}
}
}
}
}
}
struct PersonEntity: Hashable {
let name: String
let age: Int?
}
struct PersonAddOrEditView: View {
let personEntity: PersonEntity?
@State var name: String
@State var age: Int?
private var isNew: Bool {
personEntity == nil
}
init(personEntity: PersonEntity) {
self.personEntity = personEntity
self.name = personEntity.name
self.age = personEntity.age
}
init() {
self.personEntity = nil
self.name = ""
self.age = 10
}
var body: some View {
VStack {
List {
TextField("Name", text: $name)
Picker("Age", selection: $age) {
ForEach(1...100, id: .self) { ageItem in
Text("(ageItem)")
.tag(ageItem)
.id(ageItem)
}
}
.pickerStyle(.menu)
// NavigationLink("(age ?? 0)") {
// List(selection: $age) {
// ForEach(1...100, id: .self) { ageItem in
// Text("(ageItem)")
// .tag(ageItem)
// .id(ageItem)
// }
// }
// }
}
if isNew {
Button("Add") { }
} else {
Button("Update") { }
}
}
}
}
#Preview {
NavigationLinkForm()
}