ios - 常规委托(delegate)和 ProxyDelegate RxSwift

标签 ios swift rx-swift

我是 RxSwift 的新手,正在尝试实现这个框架 https://github.com/rubygarage/collection-view-layouts进入我的项目。

到目前为止,我有这个:

extension BaseLayout: HasDelegate {
    public typealias Delegate = LayoutDelegate
}

class RxLayoutDelegateDelegateProxy: DelegateProxy<BaseLayout, LayoutDelegate>, DelegateProxyType, LayoutDelegate {
    public weak private(set) var baseLayout: BaseLayout?

    public init(baseLayout: ParentObject) {
        self.baseLayout = baseLayout
        super.init(parentObject: baseLayout,
                   delegateProxy: RxLayoutDelegateDelegateProxy.self)
    }

    static func registerKnownImplementations() {
        self.register { RxLayoutDelegateDelegateProxy(baseLayout: $0) }
    }
}

extension Reactive where Base: BaseLayout {

    public var delegate: DelegateProxy<BaseLayout, LayoutDelegate> {
        return RxLayoutDelegateDelegateProxy.proxy(for: base)
    }

    var cellSize: ControlEvent<CGSize> {

    }
}

但是,一旦我有照片,我仍然无法弄清楚如何传递图像大小。有人可以帮忙吗?
谢谢!

最佳答案

你很亲密。因为委托(delegate)方法返回一个值,所以你必须像 items 那样实现它。 UITableView 响应式扩展中的函数。像这样的东西:

extension BaseLayout: HasDelegate {
    public typealias Delegate = LayoutDelegate
}

class LayoutDelegateProxy
    : DelegateProxy<BaseLayout, LayoutDelegate>
    , DelegateProxyType
    , LayoutDelegate {

    init(parentObject: BaseLayout) {
        super.init(parentObject: parentObject, delegateProxy: LayoutDelegateProxy.self)
    }

    deinit {
        _cellSize.onCompleted()
    }

    public static func registerKnownImplementations() {
        self.register { LayoutDelegateProxy(parentObject: $0) }
    }

    func cellSize(indexPath: IndexPath) -> CGSize {
        return (try? _cellSize.value())?[indexPath] ?? CGSize.zero
    }

    fileprivate let _cellSize = BehaviorSubject<[IndexPath: CGSize]>(value: [:])
}

extension Reactive where Base: BaseLayout {
    var delegate: LayoutDelegateProxy {
        return LayoutDelegateProxy.proxy(for: base)
    }

    func items<Source: ObservableType>(_ source: Source) -> Disposable where Source.Element == [IndexPath: CGSize] {
        return source
            .bind(to: delegate._cellSize)
    }
}

使用示例:
let sizes = Observable<[IndexPath: CGSize]>.just([
    IndexPath(item: 0, section: 0): CGSize(width:  50, height:  50),
    IndexPath(item: 1, section: 0): CGSize(width: 100, height:  50),
    IndexPath(item: 2, section: 0): CGSize(width:  50, height: 100)
])

sizes
    .bind(to: baseLayout.rx.items)
    .disposed(by: disposeBag)

关于ios - 常规委托(delegate)和 ProxyDelegate RxSwift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60257051/

相关文章:

ios - 如何从 EKEventStore 检索 3 年前的事件

iphone - 如何使用 AVFoundation 为您的视频添加不同图像和不同 CMTime 的水印

swift - 禁用相机 View 增长动画

php - iOS 应用程序从 PHP 网络服务器获取结果的时间过长

swift - RxSwift 取消 RxMoya 网络请求

swift - CocoaAction/带有 UIAlertController 的操作

iphone - 使用四元数代替滚动、俯仰和偏航来跟踪设备运动

javascript - 如何使用访问 token 来规避 FB.login()

swift - 导入框架构建以在 Swift REPL 中进行测试失败?

swift - RxSwift 和LatestFrom 奇怪的行为