整合SwiftUI
1、帮助你在你现有的APP整合SwiftUI,通过使用托管控制器。
UIHostingController 继承至 UIViewController
2、在SwiftUI视图内嵌入使用现有框架创建的视图
Representable Protocol:可代表协议
3、Representable Context(可代表上下文),共三部分
- Coordinator:协调器。帮助协调你的视图可用于实施通用模式,例如委托、数据源、目标动作
- Environment:情境。帮助你读取SwiftUI的环境,比如配色方案、尺寸类
- Transaction:动画。让我们的视图了解SwiftUI中是否有动画
案例:例如在SwiftUI中使用使用UIKit 创建的View,就可以通过 对应的代表协议——UIViewRepresentable去实现。
4、整合数据模型(动态数据)到 SwiftUI 中——使用BindableObject
BindableObject是一个很简单的协议,你所需要做的就是公开发布一个didChange发布器。
- 通过发布器监听数据变化
class MyDataModel : BindableObject {
public var didChange: NotificationCenter.default.publisher(for: .MyNotification)
.receive(on: RunLoop.main)
}
- 通过KVO监听数据变化
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()
}
}
- 通过指定发布器监听数据变化
class MyDataModel : BindableObject {
var didChange = PassthroughSubject<Void, Never>()
}
extension MyDataModel : NSFetchedResultsControllerDelegate {
func controllerDidChangeContent(
_ controller: NSFetchedResultsController<NSFetchRequestResult>)
{
didChange.send()
}
}
网友评论