(протестировано в Xcode 11.3, Swift 5.1.3)
Я хочу расширить UIView, обернуть его UIViewRepresentable и использовать в качестве Swift View. Однако мне трудно получить доступ к расширенным функциям пользовательского UIView из оболочки Swift View.
class UICameraCaptureImageView: UIImageView, AVCaptureVideoDataOutputSampleBufferDelegate {
@State var capturedImage: UIImage? = UIImage(named: "default_placeholder")
func startCameraCapture() {
// start camera capture when it is ready
}
// AVCaptureVideoDataOutputSampleBufferDelegate delegate method follows
// ...
}
struct CameraCaptureImageView: UIViewRepresentable {
// cannot set containedUIView in makeUIView/updateUIView, and they are not mutating method
private var containedUIView: UICameraCaptureImageView?
func makeUIView(context: UIViewRepresentableContext<CameraCaptureImageView>) ->
UICapturedImageView {
UICapturedImageView()
}
func updateUIView(_ uiView: UICapturedImageView,
context: UIViewRepresentableContext< CameraCaptureImageView>) {
uiView.image = capturedImage
}
func startCameraCapture() {
// redirect to UICameraCaptureImageView.startCameraCapture(),
// but cannot set self.containedUIView
guard self.containedUIView != nil else {
print("The containedUICaptureView doesn't exist")
return
}
self.containedUIView?.startCameraCapture()
}
}
Сначала, хотя это своего рода стратегия с сохранением состояния, я попытался объявить переменную-член в CameraCaptureImageView и установить экземпляр UICameraCaptureImageView, когда он будет создан. Но, как вы видите, makeUIView () не объявлен как метод мутирования, поэтому я не могу изменять любые члены CameraCaptureImageView.
Как получить доступ к расширенной пользовательской функции startCameraCapture () в моем подклассе UIView из оболочки UIViewRepresentable? Или есть ли какое-либо достойное решение без сохранения состояния для использования расширенного старого UIView в SwiftUI?