Bagaimana saya bisa mendeteksi klik kanan di SwiftUI?

10

Saya sedang menulis aplikasi Tambang sederhana untuk membantu saya mengenal SwiftUI. Karena itu, saya ingin klik primer (biasanya LMB) untuk "menggali" (mengungkapkan apakah ada tambang di sana), dan klik sekunder (biasanya RMB) untuk menempatkan bendera.

Saya memiliki penggalian yang bekerja! Tapi saya tidak tahu bagaimana cara menempatkan bendera, karena saya tidak tahu cara mendeteksi klik sekunder.

Inilah yang saya coba :

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.gesture(TapGesture().onEnded(self.handleUserDidTap(square)))

Seperti yang saya katakan sebelumnya, fungsi yang dikembalikan oleh handleUserDidTapdisebut dengan benar pada klik, tetapi yang dikembalikan handleUserDidAltTaphanya dipanggil ketika saya menahan tombol Kontrol. Itu masuk akal karena itulah yang dikatakan kode ... tapi saya tidak melihat API apa pun yang dapat membuatnya mendaftar klik sekunder, jadi saya tidak tahu harus berbuat apa lagi.

Saya juga mencoba ini, tetapi perilakunya tampak identik:

BoardSquareView(
    style: self.style(for: square),
    model: square
)
.gesture(TapGesture().modifiers(.control).onEnded(self.handleUserDidAltTap(square)))
.onTapGesture(self.handleUserDidTap(square))
Ben Leggiero
sumber
1
Tautan pertama Anda rusak. Repo pribadi?
Gil Birman
.onTapGesture() coba lihat.
Raymond
Ups, kau benar @GilBirman! Tetap; maaf soal itu
Ben Leggiero
@ Raymond Saya mencobanya dulu. Kecuali jika saya melewatkan sesuatu yang besar, kelihatannya akan berlaku identik.gesture(TapGesture().onEnded(.......))
Ben Leggiero

Jawaban:

4

Sebagaimana SwiftUI berdiri sekarang, ini tidak mungkin secara langsung. Saya yakin ini akan terjadi di masa depan, tetapi saat ini, hal TapGestureitu jelas difokuskan terutama pada kasus penggunaan iOS yang tidak memiliki konsep "klik kanan" jadi saya pikir itu sebabnya ini diabaikan. Perhatikan konsep "pers lama" adalah warga negara kelas satu dalam bentuk LongPressGesture, dan itu hampir secara eksklusif digunakan dalam konteks iOS, yang mendukung teori ini.

Yang mengatakan, saya menemukan cara untuk membuat ini berhasil. Yang harus Anda lakukan adalah kembali ke teknologi yang lebih lama, dan menanamkannya ke tampilan SwiftUI Anda.

struct RightClickableSwiftUIView: NSViewRepresentable {
    func updateNSView(_ nsView: RightClickableView, context: NSViewRepresentableContext<RightClickableSwiftUIView>) {
        print("Update")
    }

    func makeNSView(context: Context) -> RightClickableView {
        RightClickableView()
    }

}

class RightClickableView : NSView {
    override func mouseDown(with theEvent: NSEvent) {
        print("left mouse")
    }

    override func rightMouseDown(with theEvent: NSEvent) {
        print("right mouse")
    }
}

Saya menguji ini, dan itu berhasil bagi saya di dalam aplikasi SwiftUI yang cukup kompleks. Pendekatan dasar di sini adalah:

  1. Buat komponen mendengarkan Anda sebagai NSView.
  2. Bungkus dengan tampilan SwiftUI yang mengimplementasikan NSViewRepresentable.
  3. Masukkan implementasi Anda ke UI di tempat yang Anda inginkan, seperti yang akan Anda lakukan dengan tampilan SwiftUI lainnya.

Bukan solusi yang ideal, tetapi mungkin cukup baik untuk saat ini. Saya harap ini menyelesaikan masalah Anda sampai Apple memperluas kemampuan SwiftUI lebih lanjut.

BT
sumber
Terima kasih. Ini pada dasarnya apa yang saya lakukan untuk saat ini . Sangat menyedihkan bahwa ini adalah kesan pertama mereka dengan kerangka itu. Saya akan menandai ini sebagai diterima sampai (semoga 🤞🏼) solusi yang lebih baik datang
Ben Leggiero
1
Welp; Sepertinya ini adalah jawaban terbaik hari ini. Hadiah itu milikmu! Semoga suatu hari nanti kita akan memiliki solusi resmi.
Ben Leggiero