[英]Regular delegate and ProxyDelegate RxSwift
我是 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> {
}
}
但是仍然無法弄清楚一旦我有了照片,我該如何傳遞圖像大小。 請問有人可以幫忙嗎? 謝謝!
你很接近。 因為委托方法返回一個值,所以你必須更像 UITableView 響應式擴展中的items
函數來實現它。 像這樣的東西:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.