我正在尝试向我的列表添加一个简单的滑动操作。但由于某种原因无法按下该按钮。当我执行完全滑动时,它会起作用。
这是我的代码:
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)
}
就像我说的,按下按钮不会打印任何内容,但完全滑动会打印任何内容。
我刚刚找到了答案。我使用此代码在点击某处时关闭键盘。这阻止了按钮被按下。
var body: some View {
VStack {
my code
}
.onTapGesture {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
将
.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
这工作正常,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
还使用 @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)**
}
我也遇到了同样的问题,结果发现包含视图有一个 .onTapGesture 处理程序,它有效地捕获按钮上的按下操作,使其仅在完全滑动后才起作用,但在点击时不起作用。