I am trying to integrate a UIKit view into my SwiftUI project using UIViewRepresentable
as an intermediate.
A TestViewVC.swift
file was created containing just a simple IBOutlet:
import Foundation
import UIKit
class TestViewVC: UIViewController {
@IBOutlet weak var testLabel: UILabel!
}
A corresponding TestViewVC.xib
file was creating containing just a single label centred on screen which was then connected to the testLabel IBOoutlet. The TestViewVC wasassigned as the File Owner's class.
These are then displayed within the SwiftUI context through the use of a TestRepresentableView.swift and TestViewVC.swift class (shown below).
//TestRepresentableView.swift
import SwiftUI
struct TestRepresentableView: UIViewRepresentable {
func makeUIView(context: Context) -> UIView {
// Load the XIB file and return its view
let nib = UINib(nibName: "TestViewVC", bundle: nil)
return nib.instantiate(withOwner: nil, options: nil)[0] as! UIView
}
func updateUIView(_ uiView: UIView, context: Context) {
// Update the view here if needed
}
}
//TestViewVC.swift
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
TestRepresentableView()
}
}
}
The app runs fine on debug however an NSUnknownKeyException
is raised whenever label is connected to the IBOutlet. (Or any other outlet for that matter, even simply connecting the view results in the same error).
Any idea of which this is happening?
As Geoff pointed out, a UIViewControllerRepresentable
should be used instead of UIViewRepresentable
to encapsulate both the view and the view controller, including any additional properties and behaviors that are needed.
Updated code below:
import SwiftUI
struct TestRepresentableVC: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> TestViewVC {
let viewController = TestViewVC(nibName: "TestViewVC", bundle: nil)
return viewController
}
func updateUIViewController(_ uiViewController: TestViewVC, context: Context) {
// update the view controller here if needed
}
}