CascadingTableDelegate alternatives and similar libraries
Based on the "Table View / Collection View" category.
Alternatively, view CascadingTableDelegate alternatives based on common mentions on social networks and blogs.
-
SwipeCellKit
Swipeable UITableViewCell/UICollectionViewCell based on the stock Mail.app, implemented in Swift. -
MCSwipeTableViewCell
DISCONTINUED. π Convenient UITableViewCell subclass that implements a swippable content to trigger actions (similar to the Mailbox app). -
HGPlaceholders
Nice library to show placeholders and Empty States for any UITableView/UICollectionView in your project -
ReverseExtension
A UITableView extension that enables cell insertion from the bottom of a table view. -
CenteredCollectionView
A lightweight UICollectionViewLayout that 'pages' and centers its cells π‘ written in Swift -
Bohr
DISCONTINUED. Bohr allows you to set up a settings screen for your app with three principles in mind: ease, customization and extensibility. -
ListPlaceholder
ListPlaceholder is a swift library allows you to easily add facebook style animated loading placeholder to your tableviews or collection views. -
GLTableCollectionView
Netflix and App Store like UITableView with UICollectionView, written in pure Swift 4.2 -
KDDragAndDropCollectionView
This component allows for the transfer of data items between collection views through drag and drop -
DataSources
πΎ ππ± Type-safe data-driven CollectionView, TableView Framework. (We can also use ASCollectionNode) -
DTTableViewManager
Protocol-oriented UITableView management, powered by generics and associated types. -
TLIndexPathTools
TLIndexPathTools is a small set of classes that can greatly simplify your table and collection views. -
CollapsibleTableSectionViewController
:tada: Swift library to support collapsible sections in a table view. -
RHPreviewCell
I envied so much Spotify iOS app this great playlist preview cell π, I decided to create my own one πΆ. Now you can give your users ability to quick check "what content is hidden under your UITableViewCell". Great think is that this Library not requires 3D Touch support from user deviceπ₯. -
SquareMosaicLayout
An extandable mosaic UICollectionViewLayout with a focus on extremely flexible customizations :large_orange_diamond: -
TRMosaicLayout
A mosaic collection view layout inspired by Lightbox's Algorithm, written in Swift πΆ -
HoverConversion
DISCONTINUED. HoverConversion realized vertical paging with UITableView. UIViewController will be paging when reaching top or bottom of UITableView contentOffset. -
GenericDataSource
A generic small reusable components for data source implementation for UITableView/UICollectionView in Swift. -
PJFDataSource
PJFDataSource is a small library that provides a simple, clean architecture for your app to manage its data sources while providing a consistent user interface for common content states (i.e. loading, loaded, empty, and error). -
AZCollectionViewController
Easy way to integrate pagination with dummy views in CollectionView, make Instagram "Discover" within minutes.
CodeRabbit: AI Code Reviews for Developers

* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of CascadingTableDelegate or a related project?
README
CascadingTableDelegate
A no-nonsense way to write cleaner UITableViewDelegate
and UITableViewDataSource
.
Why is this library made?
In common iOS development, UITableView
has became the bread and butter for building rich pages with repetitive elements. This page, for example:
[Sample Page](ReadmeImages/sample-page-screenshot.jpg)
(Kudos to Wieky for helping me creating this sample page's design! π)
Still, using UITableView
has its own problems.
As you know, to display the contents, UITableView
uses UITableViewDelegate
and UITableViewDataSource
- compliant objects. This often became the cause of my headache since UITableView
only allows one object to become the delegate
and dataSource
. These limitations might lead to an unnecessarily huge source code file - caused by know-it-all Megamoth methods. Some common victims of this problem are tableView(_:cellForRowAt:)
, tableView(_:heightForRowAt:)
, and tableView(_:didSelectRowAt:)
.
Because of this, there are times when I thought it be nice if we could split the delegate
and dataSource
method calls into each section or row.
Meet CascadingTableDelegate.
CascadingTableDelegate
is an approach to break down UITableViewDelegate
and UITableViewDataSource
into tree structure, inspired by the Composite pattern. Here's the simplified structure of the protocol (with less documentation):
public protocol CascadingTableDelegate: UITableViewDataSource, UITableViewDelegate {
/// Index of this instance in its parent's `childDelegates`. Will be set by the parent.
var index: Int { get set }
/// Array of child `CascadingTableDelegate` instances.
var childDelegates: [CascadingTableDelegate] { get set }
/// Weak reference to this instance's parent `CascadingTableDelegate`.
weak var parentDelegate: CascadingTableDelegate? { get set }
/**
Base initializer for this instance.
- parameter index: `index` value for this instance. May be changed later, including this instance's `parentDelegate`.
- parameter childDelegates: Array of child `CascadingTableDelegate`s.
- returns: This class' instance.
*/
init(index: Int, childDelegates: [CascadingTableDelegate])
/**
Preparation method that will be called by this instance's parent, normally in the first time.
- note: This method could be used for a wide range of purposes, e.g. registering table view cells.
- note: If this called manually, it should call this instance child's `prepare(tableView:)` method.
- parameter tableView: `UITableView` instance.
*/
func prepare(tableView tableView: UITableView)
}
Long story short, this protocol allows us to propagate any UITableViewDelegate
or UITableViewDataSource
method call it receives to its child, based on the section
or row
value of the passed IndexPath
.
But UITableViewDelegate and UITableViewDataSource has tons of methods! Who will propagate all those calls?
Worry not, this library did the heavy lifting by creating two ready-to-use classes, CascadingRootTableDelegate
and CascadingSectionTableDelegate
. Both implements CascasdingTableDelegate
protocol and the propagating logic, but with different use case:
CascadingRootTableDelegate
:- Acts as the main
UITableViewDelegate
andUITableViewDataSource
for theUITableView
. - Propagates almost all of delegate and dataSource calls to its
childDelegates
, based onsection
value of the passedIndexPath
and the child'sindex
. - Returns number of its
childDelegates
fornumberOfSections(in:)
call.
- Acts as the main
CascadingSectionTableDelegate
:- Does not sets itself as
UITableViewDelegate
andUITableViewDataSource
of the passedUITableView
, but waits for itsparentDelegate
method calls. - Just like
CascadingRootTableDelegate
, it also propagates almost all of delegate and dataSource calls to itschildDelegates
, but based by therow
of passedIndexPath
. - Returns number of its
childDelegates
fortableView(_:numberOfRowsInSection:)
call.
- Does not sets itself as
Here's a diagram to potray how a tableView(_:cellForRowAt:)
call works to those classes:
[Example Logic Diagram](ReadmeImages/example-logic-diagram.jpg)
Both classes also accepts your custom implementations of CascadingTableDelegate
(which is only UITableViewDataSource
and UITableViewDelegate
with few new properties and methods, really) as their childDelegates
. Plus, you could subclass any of them and call super
on the overriden methods to let them do the propagation - Chain-of-responsibility-esque style π
Here's a snippet how the long page above is divided into section delegates in the sample code:
[Section Delegates](ReadmeImages/section-delegates.jpg)
All the section delegate classes then added as childs to a single CascadingRootTableDelegate
. Any change on the sequence or composition of its childDelegates
will affect the displayed table. Clone this repo and try it out in sample project! π
Pros and Cons
Pros
With CascadingTableDelegate, we could:
- Break down
UITableViewDataSource
andUITableViewDelegate
methods to each section or row, resulting to cleaner, well separated code. - Use the familiar
UITableViewDataSource
andUITableViewDelegate
methods that we have been used all along, allowing easier migrations for the old code.
Other pros:
- All implemented methods on
CascadingRootTableDelegate
andCascadingSectionTableDelegate
are unit tested! To run the tests, you could:- Open the sample project and run the available tests, or
- Execute
run_tests.sh
in your terminal.
- This library is available through Cocoapods and Carthage! π
Cons
1. Unpropagated special methods
As you know, not all UITableViewDelegate
method uses single IndexPath
as their parameter, which makes propagating their calls less intuitive. Based on this reasoning, CascadingRootTableDelegate
and CascadingSectionTableDelegate
doesn't implement these UITableViewDelegate
methods:
sectionIndexTitles(for:)
tableView(_:sectionForSectionIndexTitle:at:)
tableView(_:moveRowAt:to:)
tableView(_:shouldUpdateFocusIn:)
tableView(_:didUpdateFocusInContext:with:)
indexPathForPreferredFocusedView(in:)
tableView(_:targetIndexPathForMoveFromRowAt: toProposedIndexPath:)
Should you need to implement any of those, feel free to subclass both of them and add your own implementations! π
2. tableView(_:estimatedHeightFor...:)
method handlings
There are three optional UITableViewDelegate
methods that used to estimate heights:
tableView(_:estimatedHeightForRowAt:)
,tableView(_:estimatedHeightForHeaderInSection:)
, andtableView(_:estimatedHeightForFooterInSection:)
.
CascadingRootTableDelegate
and CascadingSectionTableDelegate
implements those calls for propagating it to the childDelegates
. And since both of them implements those methods, they will allow UITableView
to always call those methods to every childDelegates
, should they found any of their child implements those methods.
To prevent layout breaks, CascadingRootTableDelegate
and CascadingSectionTableDelegate
will call its childDelegate's tableView(_:heightFor...:)
counterpart for the unimplemented methods, so the UITableView
will render it correctly. If your tableView(_:heightFor...:)
methods use heavy calculations, it is advised to implement the tableView(_:estimatedHeightFor...:)
counterpart of them.
Should both method not implemented by the childDelegate
, CascadingRootTableDelegate
and CascadingSectionTableDelegate
will return UITableViewAutomaticDimension
for tableView(_:estimatedHeightForRowAt:)
, and 0
for tableView(_:estimatedHeightForHeaderInSection:)
and tableView(_:estimatedHeightForFooterInSection:)
.
For details of every method's default return value (that has one), please refer to the [Default Return Value documentation](Documentation/DefaultReturnValues.md).
3. weak
declaration for parentDelegate
Swift won't allow us to add weak
modifier in protocols, but we need it for CascadingTableDelegate
's parentDelegate
property. Kindly add the weak
modifier manually in the front of parentDelegate
property of your CascasdingTableDelegate
-compliant class to prevent retain cycles! π
Still, if you still think typing it manually is a tedious job, just subclass the CascadingBareTableDelegate
out. It's a bare implementation of the CascadingTableDelegate
, without the propagating logic π
Example
To run the example project, clone the repo, and run pod install
from the Example directory first.
Requirements
Below is the list of versions with its corresponding Swift version:
Swift Version | CascadingTableDelegate Version |
---|---|
5.0 | 4.x |
4.2 | 3.2.x |
4.0 | 3.0.x |
3.x | 2.x |
2.2 | 1.x |
Installation
Cocoapods
To install CascadingTableDelegate using CocoaPods, simply add the following line to your Podfile:
pod "CascadingTableDelegate", "~> 3.2"
Carthage
To install CascadingTableDelegate using Carthage, simply add the following line to your Cartfile:
github "edopelawi/CascadingTableDelegate" ~> 3.0
Author
Ricardo Pramana Suranta, [email protected]
License
CascadingTableDelegate is available under the MIT license. See the LICENSE file for more info.
*Note that all licence references and agreements mentioned in the CascadingTableDelegate README section above
are relevant to that project's source code only.