Использование делегатов и RxCocoa показывает Аргумент «#selector» относится к экземпляру, который не подвергается Objective-C - PullRequest
1 голос
/ 30 апреля 2019

Я хочу, чтобы это удаление было реагирующим с RxCcocoa и RxSwift с использованием DelegateProxy.Я получаю эту ошибку:

Аргумент '#selector' относится к методу экземпляра rangeSeekSlider (_: didChange: maxValue :) ', который не доступен Objective-C

Делегат, которого я конвертирую из этой библиотеки: https://github.com/WorldDownTown/RangeSeekSlider/blob/master/Sources/RangeSeekSliderDelegate.swift

import CoreGraphics

public protocol RangeSeekSliderDelegate: class {

/// Called when the RangeSeekSlider values are changed
///
/// - Parameters:
///   - slider: RangeSeekSlider
///   - minValue: minimum value
///   - maxValue: maximum value
func rangeSeekSlider(_ slider: RangeSeekSlider, didChange minValue: CGFloat, maxValue: CGFloat)

...
}

А вот прокси делегата

import RxSwift
import RxCocoa
import RangeSeekSlider

final class RxRangeSeekSliderDelegateProxy:
DelegateProxy<RangeSeekSlider, RangeSeekSliderDelegate>,
RangeSeekSliderDelegate,
DelegateProxyType {

init(rangeSeekSlider: RangeSeekSlider) {
    super.init(parentObject: rangeSeekSlider, delegateProxy: RxRangeSeekSliderDelegateProxy.self)
}

static func registerKnownImplementations() {
    register { RxRangeSeekSliderDelegateProxy(rangeSeekSlider: $0) }
}

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

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

Реактивное расширение ползунка, это гдеЯ получаю сообщение об ошибке:

import RxSwift
import RxCocoa
import RangeSeekSlider


extension Reactive where Base: RangeSeekSlider {
var delegate: DelegateProxy<RangeSeekSlider, RangeSeekSliderDelegate> {
    return RxRangeSeekSliderDelegateProxy.proxy(for: base)
}

var didChange: Observable<(Bool, Bool)> {
    let source = delegate.methodInvoked(#selector(RangeSeekSliderDelegate.rangeSeekSlider(_:didChange:maxValue:)))
        .map{ (parameters) in
            return (parameters[0] as? Bool ?? false, parameters[1] as? Bool ?? false)
    }
    return source
}

}

1 Ответ

2 голосов
/ 01 мая 2019

Протокол сам должен быть выставлен Objective-C.

Изменить

public protocol RangeSeekSliderDelegate: class {

на

@objc public protocol RangeSeekSliderDelegate {
...