整合SwiftUI——WWDC 2019

整合SwiftUI

1、帮助你在你现有的APP整合SwiftUI,通过使用托管控制器。


UIHostingController 继承至 UIViewController

2、在SwiftUI视图内嵌入使用现有框架创建的视图
Representable Protocol:可代表协议

SwiftUI使用现有视图,需要使用representable协议

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
    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()
}
extension MyDataModel : NSFetchedResultsControllerDelegate {
    func controllerDidChangeContent(
        _ controller: NSFetchedResultsController)
    {
        didChange.send()
    }
}

你可能感兴趣的:(整合SwiftUI——WWDC 2019)