Makes Swift 4 tables much simpler and declarative, like React, making it simple to add and remove sections and rows dynamically.
No more crazy switches and monster UITableViewDelegates methods! Each cell's state is declared in one place.
Forked off of Shopify's FunctionalTableData.
I've added the following,
๐ A easy to use generic CarouselCell
that it is a CellConfigType
(i.e. a FunctionalTableData cell), containing a UICollectionView
with a single type of UICollectionViewCell
.
๐ Sample cells and view controllers demonstrating how to use FunctionalTableData.
๐ Custom cells, headers, and CarouselItemCells
created can be created programically or with nibs. Simply conform the UIVIew/UICollectionViewCell to the protocol NibView
/CarouselItemNibView
.
FunctionalTableData demo with multiple types of cells.
FunctionalTableData demo where cells can be inserted and removed when you tap โ or ๐.
CollectionTableData demo where cells can be inserted and removed when you tap โ or ๐.
A generic FunctionalTableData cell with a horizontal scrolling, or vertical non-scrolling UICollectionView
.
Each CarouselCell
takes a single CarouselItemCell
type.
Each CarouselItemCell
is a UICollectionViewCell
, and is associated with a ItemModel
type that it uses to calculate its size, and configure its views.
protocol CarouselItemCell where Self: UICollectionViewCell {
associatedtype ItemModel: Equatable'
static func sizeForItem(model: ItemModel, in collectionView: UICollectionView) -> CGSize
func configure(model: ItemModel)
static func scrollDirection() -> UICollectionViewScrollDirection
}
A programically created scrolling horizontal CarouselCell.
The ItemModel
is a UIColor
, which sets the CarouselItemColorTilesCell
's color.
let cell = CarouselColorTilesCell(
key: "colorTilesCell",
state: CarouselState<CarouselItemColorTilesCell>(
itemModels: [.red, .blue, .purple, .yellow, .green, .orange],
collectionHeight: 120,
didSelectItemCell: { indexPath in
print("Did tap item \(indexPath.row)")})
)
A programically created non-scrolling vertical CarouselCell.
let fourGridCell = resizableCell(key: "fourGridCell", color: .purple, height: 100, itemsPerRow: [1, 3])
let fiveGridCell = resizableCell(key: "fiveGridCell", color: .green, height: 100, itemsPerRow: [2, 3])
let tenGridCell = resizableCell(key: "tenGridCell", color: .blue, height: 100, itemsPerRow: [4, 3, 2, 1])
A scrolling horizontal CarouselCell created using a storyboard.
let dogeItemState = CarouselItemDetailState(image: #imageLiteral(resourceName: "finedog"), title: "Doge", subtitle: "This is fine")
let dogeCarousel = CarouselDetailCell(
key: "dogeCarousel",
state: CarouselState<CarouselItemDetailCell>(
itemModels: Array(repeating: dogeItemState, count: 20),
collectionHeight: 220,
didSelectItemCell: { index in
print("Did select doge at index \(index)") }))
A CellConfigType
created with storyboard.
let detailCell = DetailCell(
key: "detailCell",
state: DetailState(
image: #imageLiteral(resourceName: "finedog"),
title: "Sample Title",
subtitle: "This is the subs on a detail cell"))
A programically created CellConfigType
.
let labelCell = LabelCell(
key: "labelCell",
actions: CellActions(selectionAction: { _ in
print("label cell tapped")
return .deselected
}),
state: LabelState(text: "This is a LabelCell"))