列表中的滑动操作:无法按下按钮

问题描述 投票:0回答:5

我正在尝试向我的列表添加一个简单的滑动操作。但由于某种原因无法按下该按钮。当我执行完全滑动时,它会起作用。

这是我的代码:

var listView: some View {
    List {
        ForEach(Array(debits.enumerated()), id: \.element) { index, debit in
            HStack {
                Text(debit.name)
                    .swipeActions(allowsFullSwipe: true) {
                        Button(action: {
                            print("Hi \(index)")
                        }, label: {
                            Image(systemName: "slider.horizontal.3")
                        })
                    }
                Spacer()
                Text(String(debit.value))
                    .frame(width: 70, alignment: .trailing)
                Text("€")
                Divider().padding(.leading, 5)
                Toggle("", isOn: $debits[index].toggle)
                    .onChange(of: debit.toggle) { newValue in
                        calculateAvailable()
                    }
                    .frame(width: 50)
            }
        }
    }.listStyle(.plain).lineLimit(1)
}

就像我说的,按下按钮不会打印任何内容,但完全滑动会打印任何内容。

list button swiftui swipe-gesture
5个回答
1
投票

我刚刚找到了答案。我使用此代码在点击某处时关闭键盘。这阻止了按钮被按下。

var body: some View {
    VStack {
        my code
    }
    .onTapGesture {
        UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
    }
}

0
投票

.swipeActions
修改器移动到包含整行的
HStack

List {
    ForEach(Array(debits.enumerated()), id: \.element) { index, debit in
        HStack {
            Text(debit.name)
                
            Spacer()
            Text(String(debit.value))
                .frame(width: 70, alignment: .trailing)
            Text("€")
            Divider().padding(.leading, 5)
            Toggle("", isOn: $debits[index].toggle)
                .onChange(of: debit.toggle) { newValue in
                    calculateAvailable()
                }
                .frame(width: 50)
        }
        .swipeActions(allowsFullSwipe: true) {
            Button(action: {
                print("Hi \(index)")
            }, label: {
                Image(systemName: "slider.horizontal.3")
            })
        }
    }
}

此外,我建议在您的

id
结构中添加稳定的
Debit
。像这样的东西:

struct Debit: Hashable, Identifiable {
    var name: String
    var value: Double
    var toggle: Bool
    let id = UUID()
}

并将其用作您的 ID:

ForEach(Array(debits.enumerated()), id: \.element.id) { index, debit in

如果您没有枚举来获取索引,那么您只需迭代

debits
,因为项目是
Identifiable

ForEach($debits) { $debit in

0
投票

这工作正常,HStack 是你的问题。尝试在 HStack 上设置 swipaction

List {
    ForEach(YourList, id: \.self) { debit in

            
            Text(debit)
                .swipeActions(allowsFullSwipe: true) {
                    Button(action: {
                        print("Hi \(index)")
                    }, label: {
                        Text("test")
                    })
                }
        }
  }
enter code here

0
投票

还使用 @FocusState 关闭键盘,不要让您按下滑动操作按钮..

@FocusState private var fieldIsFocused: Bool

不要忘记附加集中按钮

                    .swipeActions {
                        /// DELETE BUTTON
                        Button(role: .destructive) {
                            print("Delete")
                        } label: {
                            Text("Delete")
                        }
                        **.focused($fieldIsFocused)**
                        
                        /// EDIT BUTTON
                        Button {
                            print("Edited")
                        } label: {
                            Text("Edit")
                        }
                        .tint(Color.customYellow)
                        **.focused($fieldIsFocused)**

                    }

-1
投票

我也遇到了同样的问题,结果发现包含视图有一个 .onTapGesture 处理程序,它有效地捕获按钮上的按下操作,使其仅在完全滑动后才起作用,但在点击时不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.