58 lines
1.8 KiB
Swift
58 lines
1.8 KiB
Swift
//
|
|
// Clickable.swift
|
|
// VDS
|
|
//
|
|
// Created by Matt Bruce on 3/29/23.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import Combine
|
|
|
|
public protocol Clickable: ViewProtocol {
|
|
/// Sets the primary Subscriber used for the UIControl event .touchUpInside.
|
|
var onClickSubscriber: AnyCancellable? { get set }
|
|
}
|
|
|
|
extension Clickable where Self: UIControl {
|
|
/// Allows the setting of a completion block against the onClickSubscriber cancellable. This will
|
|
/// completion block will get executed against the UIControl publisher for the 'touchUpInside' action.
|
|
public var onClick: ((Self) -> ())? {
|
|
get { return nil }
|
|
set {
|
|
onClickSubscriber?.cancel()
|
|
if let newValue {
|
|
onClickSubscriber = publisher(for: .touchUpInside)
|
|
.sink { [weak self] c in
|
|
guard let self, self.isEnabled else { return }
|
|
newValue(c)
|
|
}
|
|
} else {
|
|
onClickSubscriber = nil
|
|
}
|
|
setNeedsUpdate()
|
|
}
|
|
}
|
|
}
|
|
|
|
extension Clickable where Self: UIView {
|
|
/// Allows the setting of a completion block against the onClickSubscriber cancellable. This will
|
|
/// completion block will get executed against the UIControl publisher for the 'touchUpInside' action.
|
|
public var onClick: ((Self) -> ())? {
|
|
get { return nil }
|
|
set {
|
|
onClickSubscriber?.cancel()
|
|
if let newValue {
|
|
onClickSubscriber = publisher(for: UITapGestureRecognizer())
|
|
.sink { [weak self] _ in
|
|
guard let self, self.isEnabled else { return }
|
|
newValue(self)
|
|
}
|
|
} else {
|
|
onClickSubscriber = nil
|
|
}
|
|
setNeedsUpdate()
|
|
}
|
|
}
|
|
}
|