#ios #swift #swiftui #swiftui-list #swiftui-navigationlink
#iOS #быстрый #свифтуи #список swiftui #swiftui-navigationlink
Вопрос:
Когда я использую .simultaneousGesture(TapGesture().onEnded{ //code to run })
on a NavigationLink
в SwiftUI для iOS, код выполняется нормально, и ссылка открывается.
Однако, если значение NavigationLink
находится в a List
, код выполняется, но ссылка не открывается.
Есть ли другой способ, которым я могу запустить некоторый код после List
NavigationLink
нажатия, но до TextEditor
появления?
Использование .onAppear
на TextEditor
, не подходит, потому что мне нужно, чтобы код запускался до появления TextEditor — отчасти из-за ошибки с TextEditor
повторным рендерингом, а отчасти для того, чтобы все происходило в правильном порядке.
Код для репликации проблемы:
import SwiftUI
struct ContentView: View {
@State private var textString = ""
@State private var listMembers = ["Link A", "Link B", "Link C"]
var body: some View {
NavigationView {
VStack {
List(listMembers, id: .self) { member in
NavigationLink(member, destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link A, B, or C was tapped."
print(textString)
})
}
NavigationLink("Link D", destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link D was tapped."
})
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Спасибо!
Ответ №1:
Лучшее, что я мог придумать, — это использовать ForEach вместо List . Это требует большего форматирования, чтобы сделать его красивым, но, похоже, это решает проблему.
import SwiftUI
struct ContentView: View {
@State private var textString = ""
@State private var listMembers = ["Link A", "Link B", "Link C"]
var body: some View {
NavigationView {
VStack {
/*List(listMembers, id: .self) { member in
NavigationLink(member, destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link A, B, or C was tapped."
print(textString)
})
}*/
ForEach(listMembers, id: .self) { member in
NavigationLink(member, destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link A, B, or C was tapped."
print(textString)
})
}
NavigationLink("Link D", destination: TextEditor(text: $textString))
.simultaneousGesture(TapGesture().onEnded {
textString = "Link D was tapped."
})
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}