Понимание UIViewRepresentable

Swift 5.0 iOS 13

Пытаюсь понять, как работает UIViewRepresentable, и собрать этот простой пример почти готов, но, возможно, это полная чушь. Да, я знаю, что в SwiftUI уже есть TapGesture, это всего лишь тест.

Не компилируется, потому что он говорит, что "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")
  }
 }

}

2 ответа

Решение

Просто сделай свой Coordinator это NSObject, он обычно играет роль моста / контроллера / делегата / актера, но не представляет, поэтому не должно быть is-a-UIView

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
}

Это потому, что твой Coordinator является подклассом UIView и ты

Должен вызывать назначенный инициализатор суперкласса 'UIView'

перед возвращением из init:

init(_ view: UIView) {
    self.view = view
    super.init(frame: .zero) // Or any other frame you need
}
Другие вопросы по тегам