मैं स्विफ्टयूआई में राइट-क्लिक का पता कैसे लगा सकता हूं?


10

मैं SwiftUI को जानने में मेरी मदद करने के लिए एक सरल खान ऐप लिख रहा हूं । इस तरह, मैं प्राथमिक खुदाई (आमतौर पर LMB) को "खुदाई" करना चाहता हूं (प्रकट करें कि वहां कोई खदान है), और एक ध्वज लगाने के लिए माध्यमिक क्लिक (आमतौर पर आरएमबी)।

मेरे पास खुदाई का काम है! लेकिन मैं यह पता नहीं लगा सकता कि ध्वज कैसे लगाया जाए, क्योंकि मैं यह पता नहीं लगा सकता कि द्वितीयक क्लिक का पता कैसे लगाया जाए।

यहाँ मैं कोशिश कर रहा हूँ :

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

जैसा कि मैंने पहले बताया था, द्वारा लौटाए गए फ़ंक्शन handleUserDidTapको क्लिक पर ठीक से कहा जाता है, लेकिन द्वारा लौटाया गया handleUserDidAltTapकेवल तभी बुलाया जाता है जब मैं नियंत्रण कुंजी को दबाए रखता हूं। यह समझ में आता है क्योंकि यह वही है जो कोड कहता है ... लेकिन मुझे ऐसा कोई एपीआई नहीं दिख रहा है जो इसे माध्यमिक क्लिक रजिस्टर कर सके, इसलिए मुझे नहीं पता कि और क्या करना है।

मैंने भी यह कोशिश की, लेकिन व्यवहार समान लग रहा था:

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

1
आपका पहला लिंक टूट गया है। निजी रेपो?
गिल बिरमान

.onTapGesture() इसकी जांच - पड़ताल करें।
रेमंड

वूप्स, तुम सही हो @GilBirman! फिक्स्ड; इस बारे में खेद
बेन लेगिएरो

@ रेमंड मैंने पहले कोशिश की थी। जब तक मैं कुछ बड़ा याद नहीं कर रहा हूं, तब तक यह प्रतीत होता है कि पहचान के साथ व्यवहार करना है.gesture(TapGesture().onEnded(.......))
बेन लेगिएरियो

जवाबों:


4

चूंकि अभी स्विफ्टयूआई के साथ चीजें खड़ी हैं, यह सीधे संभव नहीं है। मुझे यकीन है कि यह भविष्य में होगा, लेकिन इस समय, TapGestureमुख्य रूप से आईओएस उपयोग के मामलों पर स्पष्ट रूप से ध्यान केंद्रित किया गया है, जिसमें "राइट क्लिक" की अवधारणा नहीं है, इसलिए मुझे लगता है यही कारण है कि इस पर ध्यान नहीं दिया गया था। ध्यान दें "लॉन्ग प्रेस" अवधारणा, के रूप में एक प्रथम श्रेणी का नागरिक है LongPressGesture, और यह लगभग विशेष रूप से एक iOS संदर्भ में उपयोग किया जाता है, जो इस सिद्धांत का समर्थन करता है।

उस ने कहा, मैंने इस काम को करने का एक तरीका निकाला। आपको जो करना है वह पुरानी तकनीक पर वापस गिरता है, और इसे अपने स्विफ्टयूआई दृश्य में एम्बेड करें।

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")
    }
}

मैंने इसका परीक्षण किया, और इसने मेरे लिए काफी जटिल स्विफ्टयूआई एप्लिकेशन के अंदर काम किया। यहाँ मूल दृष्टिकोण है:

  1. एक के रूप में अपने सुनने के घटक बनाएँ NSView
  2. इसे एक स्विफ्टयूआई दृश्य के साथ लपेटें जो लागू करता है NSViewRepresentable
  3. यूआई में अपने कार्यान्वयन को रोकें जहां आप इसे चाहते हैं, जैसे आप किसी अन्य स्विफ्टयूआई दृश्य के साथ करेंगे।

एक आदर्श समाधान नहीं है, लेकिन यह अभी के लिए पर्याप्त अच्छा हो सकता है। मुझे आशा है कि यह आपकी समस्या को हल करेगा जब तक कि Apple स्विफ्टयूआई की क्षमताओं को आगे नहीं बढ़ाता है।


धन्यवाद। यह मूल रूप से है जो मैं अभी के लिए कर रहा था । वास्तव में दुखी है कि यह रूपरेखा के साथ उनकी पहली छाप है। मैं इसे तब तक के लिए स्वीकार करूंगा जब तक (उम्मीद है कि until) एक बेहतर समाधान नहीं आएगा
बेन लेगिएरियो

1
Welp; ऐसा लगता है कि यह आज सबसे अच्छा जवाब है। इनाम तुम्हारा है! उम्मीद है कि किसी दिन हमारे पास एक आधिकारिक समाधान होगा।
बेन लेगियरियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.