Piszę prostą aplikację Mines, która pomoże mi poznać SwiftUI. W związku z tym chcę, aby główne kliknięcie (zwykle LMB) „wykopało” (ujawnij, czy jest tam kopalnia), a drugie kliknięcie (zwykle RMB), aby umieścić flagę.
Kopanie działa! Ale nie mogę wymyślić, jak umieścić flagę, ponieważ nie mogę wymyślić, jak wykryć drugie kliknięcie.
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))
Jak sugerowałem wcześniej, funkcja zwracana przez handleUserDidTap
jest wywoływana poprawnie po kliknięciu, ale funkcja zwracana przez handleUserDidAltTap
jest wywoływana tylko wtedy, gdy przytrzymuję klawisz Control. Ma to sens, ponieważ tak mówi kod ... ale nie widzę żadnego interfejsu API, który mógłby zmusić go do zarejestrowania dodatkowych kliknięć, więc nie wiem, co jeszcze zrobić.
Próbowałem również tego, ale zachowanie wydawało się identyczne:
BoardSquareView(
style: self.style(for: square),
model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
źródło
.onTapGesture()
Sprawdź to..gesture(TapGesture().onEnded(.......))
Odpowiedzi:
W obecnej sytuacji ze SwiftUI nie jest to bezpośrednio możliwe. Jestem pewien, że tak będzie w przyszłości, ale w tej chwili
TapGesture
wyraźnie koncentruje się głównie na przypadkach użycia iOS, które nie mają koncepcji „kliknięcia prawym przyciskiem”, więc myślę, że dlatego to zostało zignorowane. Zwróć uwagę, że koncepcja „długiego naciśnięcia” jest obywatelem pierwszej klasy w postaciLongPressGesture
, i jest prawie wyłącznie używana w kontekście iOS, który obsługuje tę teorię.To powiedziawszy, wymyśliłem sposób, aby to zadziałało. Musisz polegać na starszej technologii i osadzić ją w widoku SwiftUI.
Przetestowałem to i działało dla mnie w dość złożonej aplikacji SwiftUI. Podstawowe podejście tutaj:
NSView
.NSViewRepresentable
.Nie jest to idealne rozwiązanie, ale na razie może być wystarczające. Mam nadzieję, że to rozwiąże Twój problem, dopóki Apple nie rozszerzy możliwości SwiftUI.
źródło