diff --git a/Source/IGListSwiftKit/IGListSingleSectionController+Refinements.swift b/Source/IGListSwiftKit/IGListSingleSectionController+Refinements.swift index 954829e7..8b1d5b87 100644 --- a/Source/IGListSwiftKit/IGListSingleSectionController+Refinements.swift +++ b/Source/IGListSwiftKit/IGListSingleSectionController+Refinements.swift @@ -30,4 +30,37 @@ extension ListSingleSectionController { sizeBlock: { size($0 as! Item, $1) } ) } + + /** + Creates a new section controller for a given cell type that will always have only one cell when present in a list. Supports any Swift value conforming to `ListIdentifiable`. + + - Parameters: + - configure: A closure that configures the cell with the Swift value item given to the section controller. + - size: A closure that returns the size for the cell given the collection context. + + - Returns: A new section controller. + + @warning Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter + (usually `self`) or the `ListAdapter`. Pass in locally scoped objects or use `weak` references! + */ + public convenience init( + configure: @escaping (Value, Cell) -> Void, + size: @escaping (Value, ListCollectionContext?) -> CGSize + ) { + self.init( + cellClass: Cell.self, + configureBlock: { (item: Any, cell: UICollectionViewCell) in + guard let value = Value(diffable: item) else { + fatalError("Expected object for value section controller to be a boxed \(Value.self), but it was \(item)") + } + configure(value, cell as! Cell) + }, + sizeBlock: { (item: Any, context: ListCollectionContext?) in + guard let value = Value(diffable: item) else { + fatalError("Expected object for value section controller to be a boxed \(Value.self), but it was \(item)") + } + return size(value, context) + } + ) + } }