DEV Community

Lankinen
Lankinen

Posted on

CS193p Notes - Lecture 14: UIKit Integration

  • UIKit is the old way of developing iOS apps
  • SwfitUI (which we have learned in this course) replaced it and is doing most of the things
  • There are still some things that might be better in UIKit or there might be some old code so it's important to understand how to use it in SwiftUI

  • Instead of having MVVM there is MVC
    • In MVC views are grouped together and controlled by a Controller
  • UIKit is object-oriented (not functional)

Alt Text

Alt Text

  • UIKit uses a concept "delegation"
    • Objects (controllers and views) often delegate some of their functionality to other objects
    • They do this by having a var called delegate
    • delegate var is constrained via a protocol with all the delegatable functionality

Enroute demo UIView (12:25)

  • We create MapView to normal Swift file (not SwiftUI) because there isn't var body

This will draw a map and add pins to the points mentioned in annotations

import SwfitUI
import UIKit
import MapKit

struct MapView: UIViewRepresentable {
  let annotations: [MKAnnotation]

  func makeUIView(context: Context) -> MKMapView {
    let mkMapView = MKMapView()
    mkMapView.delegate = context.coordinator
    mkMapView.addAnnotations(self.annotations)
    return mkMapView
  }

  func updateUIView(_ uiView: MKMapView, context: Context) {

  }

  func makeCoordinator() -> Coordinator {
    return Coordinator()
  }

  class Coordinator: NSObject, MKMapViewDelegate {
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
      let view = mapView.dequeueReusableAnnotationView(withIdentifier: "MapViewAnnotation") ??
        MKPinAnnotationView(annotation: annotation, reuseIdentifier: "MapViewAnnotation")
      view.canShowCallout = true
      return view
    }
  }
}

EmojiArt demo UIViewController (39:13)

import SwiftUI
import UIKit

typealias PickedImageHandler = (UIImage?) -> Void

struct ImagePicker: UIViewControllerRepresentable {
  // could be handled using binding but wanted to show
  // that there are different ways
  var handlePickedImage: PickedImageHandler

  func makeUIViewController(context: Context) -> UIImagePickerController {
    let picker = UIImagePickerController()
    picker.sourceType = .photoLibrary
    picker.delegate = context.coordinator
    return picker
  }

  func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {

  }

  func makeCoordinator() -> Coordinator {
    Coordinator(handlePickedImage: handlePickedImage)
  }

  class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    var handlePickedImage: PickedImageHandler

    init(handlePickedImage: @escaping PickedImageHandler) {
      self.handlePickedImage = handlePickedImage
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:
      [UIImagePickerController.InfoKey : Any]) {
      handlePickedImage(info[.originalImage] as? UIImage)
    }

    func ImagePickerControllerDidCancel(_ picker: UIImagePickerController) {
      handlePickedImage(nil)
    } 
  }
}

@RealLankinen

Originally published here

Top comments (0)