首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FSCalendar中使用RxSwift的DelegateProxy时出错

在FSCalendar中使用RxSwift的DelegateProxy时出错
EN

Stack Overflow用户
提问于 2021-08-21 11:16:54
回答 1查看 121关注 0票数 1

RxFSCalendarDelegateProxy.swift

代码语言:javascript
复制
import Foundation
import RxSwift
import RxCocoa
import FSCalendar

class RxFSCalendarDelegateProxy: DelegateProxy<FSCalendar, FSCalendarDelegate>, DelegateProxyType, FSCalendarDelegate {
    static func registerKnownImplementations() {
        self.register { (calendar) -> RxFSCalendarDelegateProxy in
            RxFSCalendarDelegateProxy(parentObject: calendar, delegateProxy: self)
        }
    }
    
    static func currentDelegate(for object: FSCalendar) -> FSCalendarDelegate? {
        return object.delegate
    }
    
    static func setCurrentDelegate(_ delegate: FSCalendarDelegate?, to object: FSCalendar) {
        object.delegate = delegate
    }
}

extension Reactive where Base: FSCalendar {
    var delegate : DelegateProxy<FSCalendar, FSCalendarDelegate> {
        return RxFSCalendarDelegateProxy.proxy(for: self.base)
    }
    
    var didSelect : Observable<Date> {
        return delegate.methodInvoked(#selector(FSCalendarDelegate.calendar(_:didSelect:at:)))
            .map({ (params) in
                return params[1] as? Date ?? Date()
            })
    }
}

MainViewController.swift

代码语言:javascript
复制
import UIKit
import ReactorKit
import FSCalendar

class MainViewController: BaseViewController, View {
    
    typealias Reactor = MainViewReactor
    
    let calendar = FSCalendar()
    let label = UILabel()
    
    init(reactor: Reactor) {
        super.init()
        defer { self.reactor = reactor }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func setupLayout() {
        self.view.addSubview(calendar)
    }
    
    override func makeConstraints() {
        
        self.calendar.snp.makeConstraints {
            $0.bottom.equalToSuperview()
            $0.top.equalToSuperview()
            $0.left.equalToSuperview()
            $0.right.equalToSuperview()
        }
    }
    
    func bind(reactor: MainViewReactor) {
        // MARK: input
        calendar.rx.didSelect.asObservable()
            .map { Reactor.Action.setDay($0) }
            .bind(to: reactor.action)
            .disposed(by: disposeBag)
        // MARK: output
    }

}

为了使用ReactorKit,我正在尝试将FSCalendarDelegate函数更改为Observable。但是当我运行这段代码时,出现了错误"RxCocoa/DelegateProxy.swift:230: Fatal error: Unexpectedly nil When implicitly an Optional value“我不知道如何修复我的DelegateProxy。为什么aSelector是nil?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-21 12:51:25

您发现了一个错误。由于FSCalendar询问委托是否响应选择器,但选择器为nil,因此代码崩溃。FSCalendar和RxCocoa都没有检查选择器中是否有nil。

I have submitted a pull request to the RxSwift repository to correct this problem.

在等待拉取请求通过系统时,您可以子类DelegateProxy并覆盖违规方法:

代码语言:javascript
复制
class MyDelegateProxy<P: AnyObject, D>: DelegateProxy<P, D> {
    override open func responds(to aSelector: Selector!) -> Bool {
        guard aSelector != nil else { return false }
        return super.responds(to: aSelector)
    }
}

class RxFSCalendarDelegateProxy: MyDelegateProxy<FSCalendar, FSCalendarDelegate>, DelegateProxyType, FSCalendarDelegate {
    static func registerKnownImplementations() {
        self.register { (calendar) -> RxFSCalendarDelegateProxy in
            RxFSCalendarDelegateProxy(parentObject: calendar, delegateProxy: self)
        }
    }

    static func currentDelegate(for object: FSCalendar) -> FSCalendarDelegate? {
        return object.delegate
    }

    static func setCurrentDelegate(_ delegate: FSCalendarDelegate?, to object: FSCalendar) {
        object.delegate = delegate
    }
}

至于为什么aSelector为零...当FSCalendar想要使用委托方法时,它首先检查该方法是否已经实现。如果不是,则检查是否实现了该方法的弃用版本。如果没有弃用的版本,那么它将询问委托是否实现了nil方法。我觉得FSCalender这样做有点傻,但很明显,如果这是在传统的委托实现上完成的,操作系统会返回false。RxCocoa只是假设没有任何库可以做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68872523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档