问题描述
Swift 5.0 iOS 13
Swift 5.0 iOS 13
试图理解 UIViewRepresentable 是如何工作的,并把这个简单的例子放在一起,几乎就完成了,但也许它完全是胡说八道.是的,我知道 SwiftUI 中已经有一个 tapGesture,这只是一个测试.
Trying to understand how UIViewRepresentable works, and put together this simple example, almost there, but maybe its complete nonsense. Yes, I know there is already a tapGesture in SwiftUI, this is just a test.
不会编译,因为它说在从初始化程序返回之前没有在所有路径上调用super.init",我尝试设置但显然不正确.
Won't compile cause it says 'super.init' isn't called on all paths before returning from initialiser, which I try and set but obviously not correctly.
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")
}
}
}
推荐答案
只要让你的 Coordinator
是一个 NSObject
,它通常扮演桥梁/控制器/代表/演员的角色,但不是展示,所以不应该是 is-a-UIView
Just make your Coordinator
is a NSObject
, it usually plays bridge/controller/delegate/actor role, but not presentation, so should not be 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
}
这篇关于理解 UIViewRepresentable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!