NSView类自定义初始化器调用super.init()传参错误咨询
问题原因
你遇到的编译错误是因为NSView原生没有接收text参数的初始化方法,你调用父类初始化时传入了不存在的参数,触发参数不匹配报错。
修正方案
只需修改TapHandlerView的初始化方法,调用NSView的标准指定初始化器即可,完整修正后代码如下:
import SwiftUI class TapHandlerView: NSView { @Binding var text: String required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } init(text: Binding<String>) { self._text = text // 调用NSView标准初始化方法,frame传.zero即可,SwiftUI会自动适配父视图尺寸 super.init(frame: .zero) // 可选添加,确保视图正常接收交互事件 self.wantsLayer = true } override func mouseDown(with event: NSEvent) { super.mouseDown(with: event) print(text) } } struct TapHandler: NSViewRepresentable { @Binding var text: String func makeNSView(context: Context) -> TapHandlerView { TapHandlerView(text: $text) } func updateNSView(_ nsView: TapHandlerView, context: Context) { } } struct ItemView: View { @State var text: String = "Hello!" var body: some View { VStack { Text("Click here!") } .overlay(TapHandler(text: $text)) } }
验证效果
修改后编译即可正常运行,点击Text区域就会在控制台打印绑定变量的当前值,同时该实现走AppKit原生响应链,不会拦截SwiftUI的onMove拖动手势,刚好适配你解决手势冲突的需求。
内容的提问来源于stack exchange,提问作者Jordi Cuenca
相关产品推荐
相关产品推荐

