了解 UIViewRepresentable
Understanding 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")
}
}
}
那是因为您的 Coordinator
是 UIView
的子类,而您
Must call a designated initializer of the superclass 'UIView'
从 init
返回之前:
init(_ view: UIView) {
self.view = view
super.init(frame: .zero) // Or any other frame you need
}
只是让你的Coordinator
是一个NSObject
,它通常起到bridge/controller/delegate/actor的作用,而不是呈现,所以不应该是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
}
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")
}
}
}
那是因为您的 Coordinator
是 UIView
的子类,而您
Must call a designated initializer of the superclass 'UIView'
从 init
返回之前:
init(_ view: UIView) {
self.view = view
super.init(frame: .zero) // Or any other frame you need
}
只是让你的Coordinator
是一个NSObject
,它通常起到bridge/controller/delegate/actor的作用,而不是呈现,所以不应该是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
}