Это мое расширение для просмотра: < /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
Программируем под IOS
1755007020
Anonymous
Это мое расширение для просмотра: < /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>
Есть ли более простой способ выполнить эту задачу? Это кажется очень сложным для такой простой вещи ...
Подробнее здесь: [url]https://stackoverflow.com/questions/79733239/how-to-define-ontapgesture-with-debounce-in-swiftui-using-passthroughsubject-sim[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия