我有一个列表,它通过营养 API 进行搜索并在列表中显示搜索结果。在升级到 iOS 18 之前,一切都运行正常。

现在,当创建列表时,有时 onTapGesture 会识别并加载食物详情页面,而列表中的其他项目根本没有注册点击?

为什么会突然改变?我现在不知道如何让列表中的每个项目都可以点击。

List(searchResults, id: \.fid) { food in
                    VStack {
                        HStack {
                            VStack(alignment: .leading) {
                                Text(food.name)
                                    .font(.system(size: 20))
                                    .padding(.bottom, 4)
                                Text("\(food.brand) - \(extractCalories(from: food.calories) ?? "nil")")
                                    .font(.system(size: 16))
                            }
                            .padding()
                            .foregroundColor(Color.white)
                            
                            Spacer()
                            
                            VStack {
                                Image(systemName: "chevron.right")
                                    .foregroundColor(Color.white)
                                    .padding(.trailing, 8)
                            }
                        }
                        .padding([.leading, .trailing], 8.0)
                        .padding(.top, 0)
                        .background(
                            Color(red: 40 / 255, green: 40 / 255, blue: 40 / 255)
                                .clipShape(RoundedRectangle(cornerRadius: 10))
                        )
                    }
                    .onAppear {
                        print(searchResults)
                    }
                    .contentShape(Rectangle()) // Ensures the entire area is tappable
                    /*.simultaneousGesture(TapGesture().onEnded {
                            print("TAPPED FOOD ID: \(food.fid)")
                            tappedFoodID = food.fid
                            tappedFoodName = food.name
                            showFoodItemDetail = true
                        })*/
                    .onTapGesture(count: 1) {
                            print("TAPPED FOOD ID: \(food.fid)")
                            tappedFoodID = food.fid
                            tappedFoodName = food.name
                            showFoodItemDetail = true
                        }
                    .listRowSeparator(.hidden)
                    .listRowBackground(Color.clear)
                    .scrollContentBackground(.hidden)
                    .padding(.horizontal, -16) // Remove horizontal padding for the whole list
                    .padding(.vertical, 0)    // Remove vertical padding for the whole list
                }

4

  • 显示我们可以编译、运行并产生问题的最小可重现代码。看起来您有一个TabView和还有一个NavigationStack,请显示这些是如何设置的以及如何List使用的。


    – 

  • 1
    我可能遇到了同样的问题,我发现如果我点击并按住几秒钟,它就会记录点击。因此,在 ios17 上可以点击的所有操作在 ios18 上突然需要非常长的点击。如果您看到同样的情况,这可能会帮助我们缩小范围。


    – 

  • 我偶然发现了一个可以解决我自己的问题的解决方案,但可能还不足以作为完整的答案:我发现将父视图包装在 NavigationStack {} 中可以让一切重新开始正常工作。对于我的应用程序,我从堆栈中的高处开始,仅比初始 App WindowGroup 低几级。很可能我的代码中有一个不在 NavigationStack 内的 NavigationLink,所以这至少是一个黑客,现在可以帮助我找到实际的错误并正确解决它。


    – 


  • 1
    我在 TabView 中的 VStack 中遇到了同样的问题。删除 TabView 解决了这个问题。但不知道为什么


    – 


最佳答案
1

我遇到了同样的问题。我将代码修改为以下内容,并且可以正常工作。

            .contentShape(Rectangle())
            .highPriorityGesture(
                TapGesture().onEnded {
                    print("TAPPED")
                }
            )