65 lines
1.9 KiB
Swift
65 lines
1.9 KiB
Swift
//
|
|
// ViewProtocol.swift
|
|
// VDS
|
|
//
|
|
// Created by Matt Bruce on 7/22/22.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
import Combine
|
|
|
|
public protocol ViewProtocol: AnyObject, Initable, Resettable, Enabling, Surfaceable, AccessibilityUpdatable {
|
|
/// Set of Subscribers for any Publishers for this Control.
|
|
var subscribers: Set<AnyCancellable> { get set }
|
|
|
|
/// Key of whether or not updateView() is called in setNeedsUpdate()
|
|
var shouldUpdateView: Bool { get set }
|
|
|
|
/// Used for setting an implementation for the default Accessible Action
|
|
var accessibilityAction: ((Self) -> Void)? { get set }
|
|
|
|
/// Called once when a view is initialized and is used to Setup additional UI or other constants and configurations.
|
|
func setup()
|
|
|
|
/// Used to make changes to the View based off a change events or from local properties.
|
|
func updateView()
|
|
|
|
/// Used to update any Accessibility properties.
|
|
func updateAccessibility()
|
|
}
|
|
|
|
extension ViewProtocol {
|
|
|
|
/// Called when there are changes in a View based off a change events or from local properties.
|
|
public func setNeedsUpdate() {
|
|
if shouldUpdateView {
|
|
shouldUpdateView = false
|
|
updateView()
|
|
updateAccessibility()
|
|
shouldUpdateView = true
|
|
}
|
|
}
|
|
}
|
|
|
|
extension ViewProtocol where Self: UIView {
|
|
|
|
/// Helper method for removing a superview and updating Self.
|
|
public func removeFromSuperview(_ view: UIView){
|
|
if view.superview != nil {
|
|
view.removeFromSuperview()
|
|
setNeedsDisplay()
|
|
}
|
|
}
|
|
}
|
|
|
|
extension ViewProtocol where Self: UIControl {
|
|
/// Helper method to assign a completion block to a specific UIControl Event using Combine and stored in the subscribers.
|
|
public func addEvent(event: UIControl.Event, block: @escaping (Self)->()) {
|
|
publisher(for: event)
|
|
.sink(receiveValue: { c in
|
|
block(c)
|
|
}).store(in: &subscribers)
|
|
}
|
|
}
|