Допустим, у меня есть массив, который я сначала добавляю к одному элементу в другом представлении, а затем добавляю второй элемент из третьего представления. Как вернуться к исходному виду и вывести из памяти два дополнительных вида?
struct ContentView: View {
@State var array: [String] = []
var body: some View {
NavigationView{
ScrollView{
ForEach(array, id: \.self) { element in
Text(element)
}
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink("+") {
Details(array: $array)
}
}
}
}
}
}
struct Details: View {
@Binding var array: [String]
var body: some View {
Button(action: { array.append("First Element") }) {
Text("Append First Element")
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink("+") {
}
}
}
}
}
struct MoreDetails: View {
@Binding var array: [String]
@Environment(\.dismiss) var dismiss
var body: some View {
Button(action: { array.append("Second Element") }) {
Text("Append Second Element")
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink("Done") {
ContentView(array: array)
}
.simultaneousGesture(TapGesture().onEnded{
dismiss()
})
}
}
}
}
Возврат данных в массив. Я хочу, чтобы кнопка «Готово» возвращалась к просмотру содержимого с элементами в массиве, возможно, я все сделал не так.
Отвечает ли это на ваш вопрос? NavigationView внутри пользовательского интерфейса TabView Swift
Проблема, с которой вы сталкиваетесь, на самом деле связана с навигацией или, по крайней мере, с тем, как вы думаете, что хотите перемещаться. То, что вы настроили с точки зрения навигации, это:
Original ContentView -> Details -> MoreDetails -> New ContentView
Когда вы хотели:
Original ContentView -> Details -> MoreDetails -> Original ContentView
без необходимости возвращаться назад по всем представлениям. Для этого, по сути, вы строите карточный домик, а затем вытаскиваете нижнюю карту, и ваша навигация возвращается к исходной ContentView
. Код с комментариями:
struct ContentView: View {
@State var array: [String] = []
// originalIsActive is your bottom card, and you will carry a reference
// through your views like a piece of twine.
@State var originalIsActive = false
var body: some View {
NavigationView{
ScrollView{
ForEach(array, id: \.self) { element in
Text(element)
}
}
.background(
// This is a programatic NavigationLink that triggers when originalIsActive
// becomes true. Placed in a background it sits and listens for originalIsActive.
NavigationLink(isActive: $originalIsActive, destination: {
Details(array: $array, originalIsActive: $originalIsActive)
}, label: {
// This is simply a nothing view, so you can't see the NavigationLink.
EmptyView()
})
// Necessary to prevent link pop back after this NavigationLink
.isDetailLink(false)
)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
// This Button sets originalIsActive to true, activating the NavigationLink.
originalIsActive = true
} label: {
Image(systemName: "plus")
}
}
}
}
}
}
struct Details: View {
@Binding var array: [String]
// Reference to originalIsActive
@Binding var originalIsActive: Bool
@State var detailsIsActive = false
var body: some View {
Button(action: { array.append("First Element") }) {
Text("Append First Element")
}
.background(
NavigationLink(isActive: $detailsIsActive, destination: {
MoreDetails(array: $array, originalIsActive: $originalIsActive)
}, label: {
EmptyView()
})
// Necessary to prevent link pop back after this NavigationLink
.isDetailLink(false)
)
.toolbar {
Button {
detailsIsActive = true
} label: {
Image(systemName: "plus")
}
}
}
}
struct MoreDetails: View {
@Binding var array: [String]
// Reference to originalIsActive
@Binding var originalIsActive: Bool
var body: some View {
Button(action: { array.append("Second Element") }) {
Text("Append Second Element")
}
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button {
// By setting originalIsActive to false, you pull out the bottom card.
// If the first link does not exist, none do.
originalIsActive = false
} label: {
Text("Original")
}
}
}
}
}
Вы говорите о навигации или возврате данных в массиве?