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()undupdateUIView()
Eine Coordinator-Klasse kann als Delegate fungieren, wenn die UIKit-Klasse einen erfordert.
Im Wesentlichen muessen drei Schritte unternommen werden, um diese Vorlage anzupassen:
- Aendere den Namen
MyViewzum Namen deiner View. - Aendere den Typ
SomeUIKitViewzum Typ derUIView, die du verwenden moechtest. - 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:
makeUIViewControllerundupdateUIViewController
Nimm dieselben drei Aenderungen vor, wenn du diese Vorlage verwendest:
- Aendere den Namen
MyViewzum Namen deiner View. - Aendere den Typ
SomeUIKitViewControllerzum Typ desUIViewController, den du verwenden moechtest. - 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..