156 lines
4.7 KiB
Swift
156 lines
4.7 KiB
Swift
//
|
|
// UISearchBar+Rx.swift
|
|
// RxCocoa
|
|
//
|
|
// Created by Krunoslav Zaher on 3/28/15.
|
|
// Copyright © 2015 Krunoslav Zaher. All rights reserved.
|
|
//
|
|
|
|
#if os(iOS) || os(tvOS)
|
|
|
|
import Foundation
|
|
#if !RX_NO_MODULE
|
|
import RxSwift
|
|
#endif
|
|
import UIKit
|
|
|
|
|
|
#if os(iOS)
|
|
extension UISearchBar {
|
|
/**
|
|
Factory method that enables subclasses to implement their own `delegate`.
|
|
|
|
- returns: Instance of delegate proxy that wraps `delegate`.
|
|
*/
|
|
public func createRxDelegateProxy() -> RxSearchBarDelegateProxy {
|
|
return RxSearchBarDelegateProxy(parentObject: self)
|
|
}
|
|
|
|
}
|
|
#endif
|
|
|
|
extension Reactive where Base: UISearchBar {
|
|
|
|
/**
|
|
Reactive wrapper for `delegate`.
|
|
|
|
For more information take a look at `DelegateProxyType` protocol documentation.
|
|
*/
|
|
public var delegate: DelegateProxy {
|
|
return RxSearchBarDelegateProxy.proxyForObject(base)
|
|
}
|
|
|
|
/**
|
|
Reactive wrapper for `text` property.
|
|
*/
|
|
public var text: ControlProperty<String> {
|
|
let source: Observable<String> = Observable.deferred { [weak searchBar = self.base as UISearchBar] () -> Observable<String> in
|
|
let text = searchBar?.text ?? ""
|
|
|
|
return (searchBar?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty())
|
|
.map { a in
|
|
return a[1] as? String ?? ""
|
|
}
|
|
.startWith(text)
|
|
}
|
|
|
|
let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, text: String) in
|
|
searchBar.text = text
|
|
}
|
|
|
|
return ControlProperty(values: source, valueSink: bindingObserver)
|
|
}
|
|
|
|
/**
|
|
Reactive wrapper for `selectedScopeButtonIndex` property.
|
|
*/
|
|
public var selectedScopeButtonIndex: ControlProperty<Int> {
|
|
let source: Observable<Int> = Observable.deferred { [weak source = self.base as UISearchBar] () -> Observable<Int> in
|
|
let index = source?.selectedScopeButtonIndex ?? 0
|
|
|
|
return (source?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty())
|
|
.map { a in
|
|
return try castOrThrow(Int.self, a[1])
|
|
}
|
|
.startWith(index)
|
|
}
|
|
|
|
let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, index: Int) in
|
|
searchBar.selectedScopeButtonIndex = index
|
|
}
|
|
|
|
return ControlProperty(values: source, valueSink: bindingObserver)
|
|
}
|
|
|
|
#if os(iOS)
|
|
/**
|
|
Reactive wrapper for delegate method `searchBarCancelButtonClicked`.
|
|
*/
|
|
public var cancelButtonClicked: ControlEvent<Void> {
|
|
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:)))
|
|
.map { _ in
|
|
return ()
|
|
}
|
|
return ControlEvent(events: source)
|
|
}
|
|
|
|
/**
|
|
Reactive wrapper for delegate method `searchBarBookmarkButtonClicked`.
|
|
*/
|
|
public var bookmarkButtonClicked: ControlEvent<Void> {
|
|
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarBookmarkButtonClicked(_:)))
|
|
.map { _ in
|
|
return ()
|
|
}
|
|
return ControlEvent(events: source)
|
|
}
|
|
|
|
/**
|
|
Reactive wrapper for delegate method `searchBarResultsListButtonClicked`.
|
|
*/
|
|
public var resultsListButtonClicked: ControlEvent<Void> {
|
|
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarResultsListButtonClicked(_:)))
|
|
.map { _ in
|
|
return ()
|
|
}
|
|
return ControlEvent(events: source)
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
Reactive wrapper for delegate method `searchBarSearchButtonClicked`.
|
|
*/
|
|
public var searchButtonClicked: ControlEvent<Void> {
|
|
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:)))
|
|
.map { _ in
|
|
return ()
|
|
}
|
|
return ControlEvent(events: source)
|
|
}
|
|
|
|
/**
|
|
Reactive wrapper for delegate method `searchBarTextDidBeginEditing`.
|
|
*/
|
|
public var textDidBeginEditing: ControlEvent<Void> {
|
|
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarTextDidBeginEditing(_:)))
|
|
.map { _ in
|
|
return ()
|
|
}
|
|
return ControlEvent(events: source)
|
|
}
|
|
|
|
/**
|
|
Reactive wrapper for delegate method `searchBarTextDidEndEditing`.
|
|
*/
|
|
public var textDidEndEditing: ControlEvent<Void> {
|
|
let source: Observable<Void> = self.delegate.observe(#selector(UISearchBarDelegate.searchBarTextDidEndEditing(_:)))
|
|
.map { _ in
|
|
return ()
|
|
}
|
|
return ControlEvent(events: source)
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|