开发者社区> 问答> 正文

如何在用户点击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:>

寻找更好的解决方案或避免此警告的解决方案。

展开
收起
游客5akardh5cojhg 2019-12-09 00:05:35 493 0
1 条回答
写回答
取消 提交回答
  • 这是因为所有单元格在更新时都呈现单个变量,因此您可以尝试

    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")))
            }
    
        }
    
    }
    
    2019-12-09 00:06:07
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载