测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可协议 | MIT |
发布最后发布 | 2016年11月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 ra1028 维护。
DelegateProxy 通过订阅处理程序接收代理事件。
这是委托代理的通用版本,由 RxSwift 提供。
这意味着可以与任何其他响应式框架结合使用,如 ReactiveCocoa 或 SwiftBond 等。
创建继承自 DelegateProxy
的类。
final class ScrollViewDelegateProxy: DelegateProxy, UIScrollViewDelegate, DelegateProxyType {
func resetDelegateProxy(owner: UIScrollView) {
owner.delegate = self
}
}
实现扩展可能会有用。
extension UIScrollView {
var delegateProxy: ScrollViewDelegateProxy {
return .proxy(for: self)
}
}
您可以按以下方式接收代理事件。
scrollView.delegateProxy
.receive(#selector(UIScrollViewDelegate.scrollViewDidScroll(_:))) { args in
guard let scrollView: UIScrollView = args.value(at: 0) else { return }
print(scrollView.contentOffset)
}
您可以通过实现 Receivable
协议的类来接收代理事件。
以下是使用响应式框架的委托代理使用示例。
创建接收器类。
final class RACReceiver: Receivable {
let (signal, observer) = Signal<Arguments, NoError>.pipe()
func send(arguments: Arguments) {
observer.send(value: arguments)
}
}
扩展
extension DelegateProxy {
func rac_receive(selector: Selector) -> Signal<Arguments, NoError> {
return RACReceiver().subscribe(to: self, selector: selector).signal
}
}
通过流接收事件。
scrollView.delegateProxy
.rac_receive(selector: #selector(UIScrollViewDelegate.scrollViewDidScroll(_:)))
.map { $0.value(at: 0, as: UIScrollView.self)?.contentOffset }
.skipNil()
.observeValues { print("ContentOffset: \($0)") }
创建接收器类。
final class BondReceiver: Receivable {
let subject = PublishSubject<Arguments, NoError>()
func send(arguments: Arguments) {
subject.next(arguments)
}
}
扩展
extension DelegateProxy {
func bnd_receive(selector: Selector) -> Signal<Arguments, NoError> {
return BondReceiver().subscribe(to: self, selector: selector).subject.toSignal()
}
}
通过流接收事件。
scrollView.delegateProxy
.bnd_receive(selector: #selector(UIScrollViewDelegate.scrollViewDidScroll(_:)))
.map { $0.value(at: 0, as: UIScrollView.self)?.contentOffset }
.ignoreNil()
.observeNext { print("ContentOffset: \($0)") }
欢迎fork和提交pull请求!!
在提交pull请求之前,请确保您已经通过了包含的测试。
如果您的pull请求包含新功能,请为它编写测试用例。
DelegateProxy 在 MIT 许可协议下发布。