使 UIButton 的 Observable isHighlighted 属性
Make Observable for UIButton isHighlighted property
我正在尝试为我的 UIButton 创建 isHighlighted Observable,以便在每次 UIButton 的 isHiglighted 更改时发送序列。我写过这样的东西
extension Reactive where Base: UIButton {
var isHighlighted: Observable<Bool> {
let property = self.base.rx.controlProperty(editingEvents: .allTouchEvents,
getter: { _ in self.base.isHighlighted },
setter: { (_, _) in })
return property
.distinctUntilChanged()
.asObservable()
}
}
问题是,它不适用于 .touchUpInside
。如果我将手指拖到 UIButton 之外然后返回,它工作正常,但不适用于点击操作。我认为在 .touchUpInside
之后它仍然会在很短的时间内突出显示。
我想我有办法了。它可以简化,但我只是复制粘贴我的完整解决方案。
public extension Reactive where Base: UIButton {
public func isHighlighted() -> Observable<Bool> {
let selector = #selector(setter: UIButton.isHighlighted)
let value: ([Any]) -> Bool? = { [=10=].first(where: { [=10=] is Bool }) as? Bool }
return base
.observable(selector: selector, value: value)
.filterNil()
.startWith(base.isHighlighted)
.distinctUntilChanged()
.share(replay: 1, scope: .whileConnected)
}
}
另外,让它发挥作用。您需要 RxOptional
和一些额外的代码:
public enum InvocationTime: Int {
case afterMessageIsInvoked
case beforeMessageIsInvoked
}
和
public extension NSObject {
public func observable<T>(selector: Selector, value: @escaping ([Any]) -> T, when: InvocationTime = .afterMessageIsInvoked) -> Observable<T> {
let observable: Observable<[Any]> = {
switch when {
case .afterMessageIsInvoked:
return rx.methodInvoked(selector)
case .beforeMessageIsInvoked:
return rx.sentMessage(selector)
}
}()
return observable
.map({ value([=12=]) })
.share(replay: 1, scope: .whileConnected)
}
}
希望对你有帮助(^
谢谢@iWheelBuy 我创建了可以运行的代码,没有 RxOptional,我部分基于您的回答所以谢谢!这是工作代码:
extension Reactive where Base: UIButton {
var isHighlighted: Observable<Bool> {
let anyObservable = self.base.rx.methodInvoked(#selector(setter: self.base.isHighlighted))
let boolObservable = anyObservable
.flatMap { Observable.from(optional: [=10=].first as? Bool) }
.startWith(self.base.isHighlighted)
.distinctUntilChanged()
.share()
return boolObservable
}
}
我正在尝试为我的 UIButton 创建 isHighlighted Observable,以便在每次 UIButton 的 isHiglighted 更改时发送序列。我写过这样的东西
extension Reactive where Base: UIButton {
var isHighlighted: Observable<Bool> {
let property = self.base.rx.controlProperty(editingEvents: .allTouchEvents,
getter: { _ in self.base.isHighlighted },
setter: { (_, _) in })
return property
.distinctUntilChanged()
.asObservable()
}
}
问题是,它不适用于 .touchUpInside
。如果我将手指拖到 UIButton 之外然后返回,它工作正常,但不适用于点击操作。我认为在 .touchUpInside
之后它仍然会在很短的时间内突出显示。
我想我有办法了。它可以简化,但我只是复制粘贴我的完整解决方案。
public extension Reactive where Base: UIButton {
public func isHighlighted() -> Observable<Bool> {
let selector = #selector(setter: UIButton.isHighlighted)
let value: ([Any]) -> Bool? = { [=10=].first(where: { [=10=] is Bool }) as? Bool }
return base
.observable(selector: selector, value: value)
.filterNil()
.startWith(base.isHighlighted)
.distinctUntilChanged()
.share(replay: 1, scope: .whileConnected)
}
}
另外,让它发挥作用。您需要 RxOptional
和一些额外的代码:
public enum InvocationTime: Int {
case afterMessageIsInvoked
case beforeMessageIsInvoked
}
和
public extension NSObject {
public func observable<T>(selector: Selector, value: @escaping ([Any]) -> T, when: InvocationTime = .afterMessageIsInvoked) -> Observable<T> {
let observable: Observable<[Any]> = {
switch when {
case .afterMessageIsInvoked:
return rx.methodInvoked(selector)
case .beforeMessageIsInvoked:
return rx.sentMessage(selector)
}
}()
return observable
.map({ value([=12=]) })
.share(replay: 1, scope: .whileConnected)
}
}
希望对你有帮助(^
谢谢@iWheelBuy 我创建了可以运行的代码,没有 RxOptional,我部分基于您的回答所以谢谢!这是工作代码:
extension Reactive where Base: UIButton {
var isHighlighted: Observable<Bool> {
let anyObservable = self.base.rx.methodInvoked(#selector(setter: self.base.isHighlighted))
let boolObservable = anyObservable
.flatMap { Observable.from(optional: [=10=].first as? Bool) }
.startWith(self.base.isHighlighted)
.distinctUntilChanged()
.share()
return boolObservable
}
}