整合SwiftUI
1、幫助你在你現(xiàn)有的APP整合SwiftUI,通過使用托管控制器。

UIHostingController 繼承至 UIViewController
2、在SwiftUI視圖內(nèi)嵌入使用現(xiàn)有框架創(chuàng)建的視圖
Representable Protocol:可代表協(xié)議

SwiftUI使用現(xiàn)有視圖,需要使用representable協(xié)議
3、Representable Context(可代表上下文),共三部分
- Coordinator:協(xié)調(diào)器。幫助協(xié)調(diào)你的視圖可用于實(shí)施通用模式,例如委托、數(shù)據(jù)源、目標(biāo)動(dòng)作
- Environment:情境。幫助你讀取SwiftUI的環(huán)境,比如配色方案、尺寸類
- Transaction:動(dòng)畫。讓我們的視圖了解SwiftUI中是否有動(dòng)畫
案例:例如在SwiftUI中使用使用UIKit 創(chuàng)建的View,就可以通過 對應(yīng)的代表協(xié)議——UIViewRepresentable去實(shí)現(xiàn)。
4、整合數(shù)據(jù)模型(動(dòng)態(tài)數(shù)據(jù))到 SwiftUI 中——使用BindableObject
BindableObject是一個(gè)很簡單的協(xié)議,你所需要做的就是公開發(fā)布一個(gè)didChange發(fā)布器。
- 通過發(fā)布器監(jiān)聽數(shù)據(jù)變化
class MyDataModel : BindableObject {
public var didChange: NotificationCenter.default.publisher(for: .MyNotification)
.receive(on: RunLoop.main)
}
- 通過KVO監(jiān)聽數(shù)據(jù)變化
class MyDataModel : NSObject, BindableObject {
public var didChange: MyObject.publisher(for: \.myKeypath)
.receive(on: RunLoop.main)
}
class MyDefaults : BindableObject {
public var didChange: AnyPublisher<Bool, Never>
init() {
let defaults = UserDefaults.standard
didChange = Publishers.Merge(
defaults.publisher(for: \.userOption1),
defaults.publisher(for: \.userOption2)
)
.receive(on: RunLoop.main)
.eraseToAnyPublisher()
}
}
- 通過指定發(fā)布器監(jiān)聽數(shù)據(jù)變化
class MyDataModel : BindableObject {
var didChange = PassthroughSubject<Void, Never>()
}
extension MyDataModel : NSFetchedResultsControllerDelegate {
func controllerDidChangeContent(
_ controller: NSFetchedResultsController<NSFetchRequestResult>)
{
didChange.send()
}
}