Это мое расширение для просмотра: < /p>
extension View {
func onTapGesture(debounce: CGFloat, action: @escaping () -> Void) -> some View {
modifier(DebounceTapModifier(action: action, debounce: debounce))
}
}
< /code>
Вот мой модификатор: < /p>
struct DebounceTapModifier: ViewModifier {
private let action: () -> Void
private let debounce: CGFloat
private let model = DebounceViewModel()
init(action: @escaping () -> Void, debounce: CGFloat) {
self.action = action
self.debounce = debounce
setupActions()
}
func body(content: Content) -> some View {
content.onTapGesture {
model.subject.send(0)
}
}
// MARK: - Private
private func setupActions() {
model.subject
.debounce(for: .seconds(debounce), scheduler: DispatchQueue.main)
.sink { _ in
action()
}
.store(in: &model.cancellables)
}
}
class DebounceViewModel {
let subject = PassthroughSubject()
var cancellables = Set()
}
< /code>
Вот как это вызывается из просмотра < /p>
Text("abc")
.onTapGesture(debounce: 4) {
print("done1") // is not called at all, even after 4 seconds
}
< /code>
Есть ли более простой способ выполнить эту задачу? Это кажется очень сложным для такой простой вещи ...
Подробнее здесь: https://stackoverflow.com/questions/797 ... ubject-sim
Как определить Ontapgesture с Debounce в Swiftui, используя PassThroughSubject более проще, чем модификатор, модификатор ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Элементы списка SwiftUI не регистрируются onTapGesture после обновления iOS 18?
Anonymous » » в форуме IOS - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-