如何处理标尺上的双击?

问题描述 投票:0回答:1

我在 SwiftUI 中有一个标尺,如下所示:

struct RulerScrollView<Content: View>: NSViewRepresentable {
    @ObservedObject var dm: DrawModel
    let content: Content

    init(_ dm: DrawModel, @ViewBuilder content: () -> Content ) {
        self.dm             = dm
        self.content        = content()
    }

    override func mouseDown(with event: NSEvent) {
         if event.clickCount == 2 {
              NotificationCenter.default.post(name: Notification.Name("ShowRulerSettings"), object: nil)
         }
    }

    func makeNSView(context: Context) -> NSScrollView {
        let scrollView = NSScrollView()
        scrollView.hasVerticalRuler = true
        scrollView.hasHorizontalRuler = true
        scrollView.rulersVisible = dm.showRulers

        let hostingView = NSHostingView(rootView: content)
        hostingView.wantsLayer = true
        hostingView.layer?.backgroundColor = NSColor.white.cgColor
        scrollView.documentView = hostingView

        return scrollView
    }

    func updateNSView(_ nsView: NSScrollView, context: Context) {
             nsView.rulersVisible = dm.showRulers
    }
}

它的名字是这样的:

Stack {
    RulerScrollView( dm ) {
        DrawingView( dm )
            .onReceive(dm.$showRulerSettings) { isShowingRulerSettings = $0 }
    }
    .background(Color.white)
}
.alert(isPresented: $isShowingRulerSettings) {
 Alert(title: Text("Ruler Settings"), message: Text("Settings here"), primaryButton: .default(Text("OK")), secondaryButton: .cancel()) }

不幸的是我收到此错误:

'override'只能在类成员上指定

user-interface swiftui
1个回答
0
投票

我将其添加到我的 RulerView 中:

func makeCoordinator() -> Coordinator {
     Coordinator(onRulerDoubleClick: onRulerDoubleClick)
}

class Coordinator: NSObject {
    var onRulerDoubleClick: () -> Void
     
    init(onRulerDoubleClick: @escaping () -> Void) {
          self.onRulerDoubleClick = onRulerDoubleClick
    }
     
    @objc func handleRulerDoubleClick(_ gestureRecognizer: NSClickGestureRecognizer) {
         onRulerDoubleClick() // Trigger the callback for double-click event
    }
}

我将其添加到 makeNSView 中:

let horizontal = NSClickGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleRulerDoubleClick))
horizontal.numberOfClicksRequired = 2
scrollView.horizontalRulerView?.addGestureRecognizer(horizontal)

let vertical = NSClickGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleRulerDoubleClick))
vertical.numberOfClicksRequired = 2
scrollView.verticalRulerView?.addGestureRecognizer(vertical)

然后我这样称呼它:

RulerView( dm ) {
    DrawingView( dm )
} onRulerDoubleClick: { isShowingRulerSettings.toggle( )}
.popover(isPresented: $isShowingRulerSettings, arrowEdge: .trailing) {
     RulerSettings( dm )
}

我发现 NS 有点痛苦,我希望 SwiftUI 继续发展。 :)

© www.soinside.com 2019 - 2024. All rights reserved.