ฉันจะตรวจสอบคลิกขวาใน SwiftUI ได้อย่างไร


10

ฉันกำลังเขียนแอพ Mines ง่ายๆเพื่อช่วยให้ฉันรู้จัก SwiftUI ด้วยเหตุนี้ฉันต้องการคลิกหลัก (ปกติคือ LMB) เพื่อ "ขุด" (เปิดเผยว่ามีของฉันอยู่ที่นั่นหรือไม่) และคลิกรอง (โดยทั่วไปคือ RMB) เพื่อวางธง

ฉันขุดได้แล้ว! แต่ฉันไม่สามารถหาวิธีวางธงได้เพราะฉันไม่สามารถหาวิธีตรวจจับการคลิกรองได้

นี่คือสิ่งที่ฉันพยายาม :

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

ดังที่ได้กล่าวไว้ก่อนหน้านี้ฟังก์ชั่นที่ส่งกลับโดยhandleUserDidTapเรียกว่าถูกต้องเมื่อคลิก แต่ฟังก์ชั่นที่ส่งกลับโดยจะถูกhandleUserDidAltTapเรียกเฉพาะเมื่อฉันกดปุ่มควบคุมค้างไว้ นั่นเป็นเหตุผลเพราะมันคือรหัสที่บอกว่า ... แต่ฉันไม่เห็น API ใดที่ทำให้ลงทะเบียนการคลิกรองดังนั้นฉันไม่รู้ว่าจะต้องทำอะไรอีก

ฉันลองสิ่งนี้ด้วย แต่พฤติกรรมก็เหมือนกัน:

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

1
ลิงค์แรกของคุณเสีย ซื้อคืนภาคเอกชน?
Gil Birman

.onTapGesture() ตรวจสอบมัน
Raymond

อ๊ะคุณพูดถูกแล้ว @GilBirman! แก้ไขแล้ว; ขอโทษด้วย
เบ็กเลกเจเอโร่

@ เรย์มอนด์ฉันลองก่อน ดูเหมือนว่าฉันจะทำตัวเหมือนกัน.gesture(TapGesture().onEnded(.......))
Ben Leggiero

คำตอบ:


4

ในขณะที่สิ่งต่าง ๆ ยืนอยู่กับ SwiftUI ในขณะนี้สิ่งนี้ไม่สามารถทำได้โดยตรง ฉันแน่ใจว่ามันจะเป็นในอนาคต แต่ในขณะTapGestureนี้ส่วนใหญ่จะเน้นอย่างชัดเจนในกรณีการใช้ iOS ซึ่งไม่มีแนวคิดของ "คลิกขวา" ดังนั้นฉันจึงคิดว่านี่เป็นสาเหตุที่ถูกเพิกเฉย ขอให้สังเกตว่าแนวคิด "long press" เป็นพลเมืองชั้นหนึ่งในรูปแบบของLongPressGestureและนั่นเกือบจะใช้เฉพาะในบริบท iOS ซึ่งสนับสนุนทฤษฎีนี้

ที่กล่าวว่าฉันคิดวิธีที่จะทำงานนี้ สิ่งที่คุณต้องทำคือถอยกลับไปใช้เทคโนโลยีรุ่นเก่าและฝังไว้ในมุมมอง SwiftUI ของคุณ

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

ฉันทดสอบสิ่งนี้และมันใช้ได้กับฉันในแอปพลิเคชัน SwiftUI ที่ค่อนข้างซับซ้อน วิธีการพื้นฐานที่นี่คือ:

  1. NSViewสร้างองค์ประกอบการฟังของคุณเป็น
  2. ห่อมันมีมุมมองที่ SwiftUI NSViewRepresentableว่าการดำเนินการ
  3. รวมการใช้งานของคุณใน UI ที่คุณต้องการเช่นเดียวกับที่คุณทำกับมุมมอง SwiftUI อื่น ๆ

ไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่อาจดีพอสำหรับตอนนี้ ฉันหวังว่านี่จะแก้ปัญหาของคุณได้จนกว่า Apple จะขยายขีดความสามารถของ SwiftUI ต่อไป


ขอบคุณ. นี้นั้นเป็นสิ่งที่ผมทำตอนนี้ เศร้าจริง ๆ ที่นี่เป็นความประทับใจครั้งแรกของพวกเขากับกรอบ ฉันจะทำเครื่องหมายสิ่งนี้ว่าเป็นที่ยอมรับจนกระทั่ง (หวังว่า🤞🏼) ทางออกที่ดีกว่าจะเกิดขึ้น
Ben Leggiero

1
Welp; ดูเหมือนว่านี่เป็นคำตอบที่ดีที่สุดในวันนี้ เงินรางวัลเป็นของคุณ! หวังว่าสักวันเราจะได้คำตอบอย่างเป็นทางการ
Ben Leggiero
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.