Hin und wieder stosse ich auf ein SDK, das nicht SwiftUI verwendet, sondern das aeltere UIKit mit seinem UIView und/oder UIViewController.

Da ich gerade dabei bin, eine Serie ueber das Programmieren von DJI-Drohnen zu schreiben, verwende ich DJIs SDKs, die auf UIKit basieren. Daher musste ich einen Weg finden, sie in meiner App zu verwenden, die auf SwiftUI basiert.

Dieser Beitrag erklaert, wie man UIView und UIViewController mit SwiftUI-Apps verwendet, und bietet einige “Copy-and-Paste”-fertige Vorlagen.

Gerne kannst du mir einen Kaffee ausgeben, falls dir dieser Beitrag gefaellt.

Eine UIView integrieren

Wenn eine UIView-basierte Klasse in SwiftUI benoetigt wird, erstelle ein Struct, das die SwiftUI-View sein wird, und implementiere das UIViewRepresentable-Protokoll.

Du stellst zwei Methoden bereit:

  • makeUIView() und
  • updateUIView()

Eine Coordinator-Klasse kann als Delegate fungieren, wenn die UIKit-Klasse einen erfordert.

Im Wesentlichen muessen drei Schritte unternommen werden, um diese Vorlage anzupassen:

  1. Aendere den Namen MyView zum Namen deiner View.
  2. Aendere den Typ SomeUIKitView zum Typ der UIView, die du verwenden moechtest.
  3. Wenn ein Delegate erforderlich ist, entferne die Kommentare und ersetze den Delegate-Typ.
struct MyView: UIViewRepresentable {
 
 typealias UIViewType = SomeUIKitView
 
 func makeUIView(context: Context) -> UIViewType {
  let myView = UIViewType()
  // myView.delegate = context.coordinator
  return myView
 }
 
 func updateUIView(_ uiView: UIViewType, context: Context) {
  // left blank
 }
 
 func makeCoordinator() -> MyView.Coordinator {
  return Coordinator(self)
 }
}
 
extension MyView {
 class Coordinator /*: SomeUIKitViewDelegate */ {
  var parent: MyView
 
  init(_ parent: MyView) {
   self.parent = parent
  }
 
  // Implement delegate methods here
 }
}

Einen UIViewController integrieren

Analog zu UIView kannst du einen UIViewController integrieren, indem du ein Struct erstellst, das UIViewControllerRepresentable implementiert. Implementiere:

  • makeUIViewController und
  • updateUIViewController

Nimm dieselben drei Aenderungen vor, wenn du diese Vorlage verwendest:

  1. Aendere den Namen MyView zum Namen deiner View.
  2. Aendere den Typ SomeUIKitViewController zum Typ des UIViewController, den du verwenden moechtest.
  3. Wenn ein Delegate erforderlich ist, entferne die Kommentare und ersetze den Delegate-Typ.
struct MyView: UIViewControllerRepresentable {
 
 typealias UIViewControllerType = SomeUIKitViewController
 
 func makeUIViewController(context: Context) -> UIViewControllerType {
  let myViewController = UIViewControllerType()
  // myViewController.delegate = context.coordinator
  return myViewController
 }
 
 func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
  // left blank
 }
 
 func makeCoordinator() -> MyView.Coordinator {
  return Coordinator(self)
 }
}
 
extension MyView {
 class Coordinator /*: SomeUIKitViewDelegate */ {
  var parent: MyView
 
  init(_ parent: MyView) {
   self.parent = parent
  }
 
  // Implement delegate methods here
 }
}

Gerne kannst du mir einen Kaffee ausgeben, wenn dir dieser Beitrag gefallen hat..

Ressourcen