1

I want to have this delete to be reactive with RxCcocoa and RxSwift using DelegateProxy. I am getting this error:

Argument of '#selector' refers to instance method 'rangeSeekSlider(_:didChange:maxValue:)' that is not exposed to Objective-C

The delegate I am converting from this library: 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)

...
}

And here is the the delegate proxy

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
}
}

The reactive extension of the slider, this is where I get the error:

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
}

}

Mohamed ALOUANE
  • 5,349
  • 6
  • 29
  • 60
  • When adding it: @ objc can only be used with members of classes, @ objc protocols, and concrete extensions of classes – Mohamed ALOUANE Apr 30 '19 at 20:15
  • The protocol _itself_ needs to be exposed to Objective-C (`@objc public protocol RangeSeekSliderDelegate`). – matt Apr 30 '19 at 22:47

1 Answers1

3

The protocol itself needs to be exposed to Objective-C.

Change

public protocol RangeSeekSliderDelegate: class {

to

@objc public protocol RangeSeekSliderDelegate {
vacawama
  • 150,663
  • 30
  • 266
  • 294
matt
  • 515,959
  • 87
  • 875
  • 1,141