Now that SwiftUI is feeling more and more established since WWDC 2020, I’m in the process of getting properly acquainted with it. In my exploring I discovered something actually more relevant to UIKit that blew me away. (and it’s been around since 2019!)
So you can use SwiftUI code to preview UIKit objects live – UIViewControllers or UIViews – from within Xcode 😲, in the canvas.
Here’s how – first UIViewController:
Let’s say you have a UIViewController subclass ViewController.
- Step 1: In the Storyboard (let’s assume Main) give your view controller a storyboard ID. Let’s say ‘ViewController’.
- Step 2: Head over to your ViewController.swift file. Make the
ViewControllerclass final:
final class ViewController: UIViewController {
- Step 3: Import SwiftUI:
import SwiftUI
- Step 4: Again, in your ViewController.swift file, create an extension for
ViewController, implementing theÂUIViewControllerRepresentableprotocol, with its two required functions:
extension TermsViewController: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> ViewController {
}
func updateUIViewController(_ uiViewController: ViewController, context: Context) {
}
}
We can ignore the updateUIViewController function as this is used by a SwiftUI parent to update the model data of the view controller.
- Step 5: Return our View Controller from the
makeUIViewControllerfunction. We can do this with theUIStoryboard.instantiateViewControllerfunction.
func makeUIViewController(context: Context) -> ViewController {
UIStoryboard(name: "Main", bundle: nil)
.instantiateViewController(
withIdentifier: "ViewController") as! ViewController
}
- Step 6: Set up a preview provider that returns your View Controller as a preview:
struct ViewControllerPreviews: PreviewProvider {
static var previews: some View {
ViewController()
}
}
Just like that, BAM, the canvas appears to the right of the ViewController, and within it, your view controller as it would appear in the simulator. But that’s not all – press the play button to the bottom right of the ViewController, and a live version of your view controller will actually run, right there in a panel next to your code, just as if it were SwiftUI. Holy cow!
Oh – and one more thing – if you want to preview a UIView rather than a UIViewController it’s pretty straightforward – just extend your custom view class with UIViewRepresentable rather than UIViewControllerRepresentable!

Leave a comment