Swiftui如何在foreach循环中为整行使用点击手势

我现在正在创建一个从 API 获取数据的 SearchBar,以红色突出显示的文本(见下图)是我想在 tap 时传递给我的 userDefault 字符串的内容。只要我点击突出显示的红色文本,这就会起作用,当您点击该行中的任何地方(例如空白处)时,是否可以获得该值?任何建议都会很棒。

@State var model: [SearchModel]
var defaults = UserDefaults.standard
@State var isOpen: Bool = false

以上是我的 State 变量和我的用户 default 。我不会显示整个代码,因为问题仅在于下面的 . 如您所见,我的值在foreach 中, 我只想拥有它,以便如果用户单击行的空白区域,我仍然可以执行此代码。

                     .onTapGesture {
                                      isOpen = true
                                     // I set the value here
                                    defaults.setValue(value.name, forKey: "location") 
                                }.fullScreenCover(isPresented: $isOpen, content: MainView.init)

上面的代码给了我正确的值,但它与文本相关联

       ZStack {
                Color(UIColor.white)
                    .ignoresSafeArea()
                ScrollView(showsIndicators: false) {
                    LazyVStack {
                        ForEach(model) { value in
                            VStack(alignment: .leading) {
                                HStack {
                                    Text(value.name)
                                        .font(.system(size: 15))
                                        .background(Color.red)
                                        .padding(.trailing, 10.0)
                                        .onTapGesture {
                                            isOpen = true
                        // I set the value here
                                            defaults.setValue(value.name, forKey: "location") 
                                        }.fullScreenCover(isPresented: $isOpen, content: MainView.init)
                          
                                }
                                HStack {
                                    Text(value.statelong)
                                        .foregroundColor(Color.gray)
                                        .font(.system(size: 13))
                                    Spacer()
                                }
                                
                            }
                            VStack {
                                Spacer()
                                Divider()
                            }
                            
                        }
                        
                        
                    }.padding(.leading, 20.0)
                    
                    
                }
                
            }
            .listRowInsets(.none)

回答

它仅适用于突出显示的文本,因为onTapGesture位于文本视图中。

1. 使用 aHStack()

将 a 嵌入VStackaHStack并添加 aSpacer()以填充整个区域,然后将 a 放置onTapGesture到 中HStack,如下所示:

    ForEach(model) { value in
                HStack{
                    VStack(alignment: .leading) {
                        HStack {
                            Text(value.name)
                                .font(.system(size: 15))
                                .background(Color.red)
                                .padding(.trailing, 10.0)
                        }
                        HStack {
                            Text(value.statelong)
                                .foregroundColor(Color.gray)
                                .font(.system(size: 13))
                            Spacer()
                        }
                        
                    }
                    Spacer()
                }.contentShape(Rectangle())
                .onTapGesture {
                    isOpen = true
                    defaults.setValue(value.name, forKey: "location")
                }.fullScreenCover(isPresented: $isOpen, content: MainView.init)
            }

2. 使用 ZStack()

或者您可以使用 aZStack来制作全视图背景并将 onTapGesture 放在 上ZStack,添加.frame(maxWidth: .infinity)ZStack以填充整个可用宽度,如下所示:

 ForEach(model) { value in
                ZStack {
                    VStack(alignment: .leading) {
                        HStack {
                            Text(value.name)
                                .font(.system(size: 15))
                                .background(Color.red)
                                .padding(.trailing, 10.0)
                        }
                        HStack {
                            Text(value.statelong)
                                .foregroundColor(Color.gray)
                                .font(.system(size: 13))
                            Spacer()
                        }
                        
                    }
                    Spacer()
                }.contentShape(Rectangle())
                .frame(maxWidth: .infinity)
                .onTapGesture {
                    isOpen = true
                    defaults.setValue(value.name, forKey: "location")
                }.fullScreenCover(isPresented: $isOpen, content: MainView.init)
            }

  • You probably need to attach `.contentShape(Rectangle())` to HStack/VStack before `.onTapGesture`.

以上是Swiftui如何在foreach循环中为整行使用点击手势的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>