The issue:
Gestures, delegates, it can be a big struggle (especially for beginners).
If you use a lot of gestures then you’ll need to implement it over and over.
One of the problems is, that code what you write will not apply to other views in your application.
If we use a lot of swipe actions, in different places within our application we want to have reusable code.
But then we see ourselfs overloaded with issues, can it be made more easy?
Yes!
How can we make it more easy?
Using a UIView
extension.
Why not a UIViewController?
“Because we also want to support other applications which have a UIView.”
How do we start?
In this post we’ll start with a UIView extension, to make it reusable for other applications (e.g. UIImageView
, UIView
, …).
In my case it didn’t work on a UITableViewController
.
Psuedo code:
import Foundation import UIKit extension UIView { // psuedo code continues
We also need a variable, but simply var myVariable = ...
does not work, since we are working in an extension.
There is a workaround, and it may be more easy than you think.
We’ll use a struct
and that will solve all our variable problems.
We want to reuse the data, so we make a static var
.
Psuedo code:
// .... psuedo code to above blocks<br>struct gestureClosures { static var up = ... static var down = ... static var left = ... static var right = ... }
We also need to create a function, to make it work!
Psuedo code:
func swipeAction( swipeDirection: UISwipeGestureRecognizer.Direction, completionHandler: @escaping ()->() ) { // Add a swiper let swiper = .... #selector(self.invokeTarget(_:)) // give the direction as in swipeDirection swiper.direction = swipeDirection // add to the view self.addGestureRecognizer(swiper) // save the completionHandler switch swipeDirection { case .up: gestureClosures.up = completionHandler case .down: gestureClosures.down = completionHandler case .left: gestureClosures.left = completionHandler case .right: gestureClosures.right = completionHandler default: print("Nothing") } }
But we still need to respond on the swipe actions!
Yup, pseudocode:
@objc func invokeTarget(...) { // disamble switch swipeDirection { case .up: gestureClosures.up() case .down: gestureClosures.down() case .left: gestureClosures.left() case .right: gestureClosures.righ() default: print("Nothing") } }
And if we translate it to functional swift code.
Then the output looks similair to above.
The complete solution:
Thanks for reading, if you like this “story” please share!
Any ideas, tips, recommendations?
Please comment!