You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:24:06