Swift 理解UIViewRepresentable

Swift 理解UIViewRepresentable,swift,swiftui,uiviewrepresentable,Swift,Swiftui,Uiviewrepresentable,Swift 5.0 iOS 13 试图理解UIViewRepresentable是如何工作的,并把这个简单的例子放在一起,几乎就在这里,但可能它完全是胡说八道。是的,我知道在SwiftUI中已经有一个Tappership,这只是一个测试 不会编译,因为它说在从初始化器返回之前,不会在所有路径上调用'super.init',我尝试设置了初始化器,但显然不正确 import SwiftUI struct newView: UIViewRepresentable { typealias UIVie

Swift 5.0 iOS 13

试图理解UIViewRepresentable是如何工作的,并把这个简单的例子放在一起,几乎就在这里,但可能它完全是胡说八道。是的,我知道在SwiftUI中已经有一个Tappership,这只是一个测试

不会编译,因为它说在从初始化器返回之前,不会在所有路径上调用'super.init',我尝试设置了初始化器,但显然不正确

import SwiftUI

struct newView: UIViewRepresentable {

typealias UIViewType = UIView
var v = UIView()

func updateUIView(_ uiView: UIView, context: Context) {
  v.backgroundColor = UIColor.yellow
}


func makeUIView(context: Context) -> UIView {
  let tapGesture = UITapGestureRecognizer(target: self, action: #selector(Coordinator.handleTap(sender:)))
  v.addGestureRecognizer(tapGesture)
  return v
}

func makeCoordinator() -> newView.Coordinator {
  Coordinator(v)
}

final class Coordinator: UIView {
  private let view: UIView

init(_ view: UIView) {
    self.view = view
}

required init?(coder: NSCoder) {
  fatalError("init(coder:) has not been implemented")
}

@objc func handleTap(sender: UITapGestureRecognizer) {
    print("tap")
  }
 }

}

这是因为您的
协调器
UIView
的子类,而您

必须调用超类“UIView”的指定初始值设定项

init
返回之前:

init(_ view: UIView) {
    self.view = view
    super.init(frame: .zero) // Or any other frame you need
}

只需将您的
协调员
设置为
NSObject
,它通常扮演桥梁/控制器/代理/参与者的角色,而不是演示,因此不应是
is-a-ui视图

final class Coordinator: NSObject {
  private let view: UIView

init(_ view: UIView) {
    self.view = view
}
还有一个

func makeUIView(context: Context) -> UIView {
  // make target a coordinator, which is already present in context !!
  let tapGesture = UITapGestureRecognizer(target: context.coordinator, 
        action: #selector(Coordinator.handleTap(sender:)))
  v.addGestureRecognizer(tapGesture)
  return v
}