Вот рабочее решение. Протестировано с помощью Xcode 11.4 / iOS 13.4
1) Создайте целевой фреймворк iOS (назовем его ModernProxy
для справки) с целью развертывания> 13.0 и сделайте его зависимым от современного пакета на основе SwiftUI (ModernLibrary в эта демонстрация), как в примере ниже
2) Сделайте встроенную в устаревшую целевую среду современную структуру, как в примере ниже
3) В ModelProxy
framework создайте класс контроллера с не аргументом по умолчанию init
, который обертывает SwiftUI root UIHostingController
с видом из внешнего пакета, как в примере ниже
import SwiftUI
import ModernLibrary // SwiftUI based external package
public class ModernProxyController: UIHostingController<ModernView> {
public init() {
super.init(rootView: ModernView())
}
@objc required dynamic init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
и сделайте этот контроллер основным классом фреймворка (на самом деле в более сложном случае основной класс может играть некоторую фабричную роль, чтобы возвращать множество контроллеров по протоколу, но вот один для простоты)
4) В вашем основном целевом ViewController (тот, в который вы хотите внедрить современный вид SwiftUI) загружайте динамически пакет прокси-фреймворка и создайте экземпляр contr oller через основной класс, как в примере ниже
class ViewController : UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// ... any other code here
if #available(iOS 13.0, *) {
if let proxyClass = Bundle(identifier: "com.Testing.ModernProxy")?.principalClass as? UIViewController.Type {
let controller = proxyClass.init()
self.addChild(controller)
controller.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(controller.view)
// ... add any needed constraints
}
} else {
// Fallback on earlier versions
}
}
// ... other controller code here