![](/img/trans.png)
[英]How to get UITableView row when user taps on UICollectionViewCell
[英]How to show an alert when the user taps on the List row in SwiftUI
當用戶在 SwiftUI 中點擊列表中的行時,顯示包含該行數據的警報的最佳方式是什么?
我正在使用此代碼。
import SwiftUI
struct ContentView: View {
var testData = ["One","Two","Three"]
var body: some View {
List{
ForEach(testData, id: \.self) { item in
Text(item).onTapGesture {
if item == "One" {
print("One selected")
print("NEED TO SHOW THE ALERT HERE")
}
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
我試圖通過這種方式解決問題:
import SwiftUI
struct ContentView: View {
@State private var showingAlert = false
var testData = ["One","Two","Three"]
var body: some View {
List{
ForEach(testData, id: \.self) { item in
Button(action: {
self.showingAlert = true
}) {
Text("\(item)")
}
.alert(isPresented: self.$showingAlert) {
Alert(title: Text("Text"), message: Text(item), dismissButton: .default(Text("Ok")))
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
但是這個解決方案會導致這個警告:
Attempt to present <UIAlertController:> which is already presenting <UIAlertController:>
尋找更好的解決方案或避免此警告的解決方案。
這是由於更新時為所有單元格呈現單個變量,因此您可以嘗試
struct ContentView: View {
@State private var showingAlert = false
@State private var item = "" // track last clicked item
var testData = ["One","Two","Three"]
var body: some View {
List{
ForEach(testData, id: \.self) { item in
Button(action: {
self.item = item
self.showingAlert = true
}) {
Text("\(item)")
}
}
}.alert(isPresented: self.$showingAlert) {
Alert(title: Text("Text"), message:Text(item), dismissButton: .default(Text("Ok")))
}
}
}
您的代碼為每個項目創建一個單獨的警報。 將alert
調用ForEach
之外,那么只會創建一個警報實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.