Latest2.0
Homepagehttps://github.com/nghialv/Sapporo
LicenseMIT
Platformsios 8.0, requires ARC
Authors

Language
[CocoaPods]()
[Carthage compatible]
(https://github.com/Carthage/Carthage)
License
Issues

cellmodel-driven collectionview manager

Features

  • Easy to manage your sections and cells (reset/insert/append/remove/update)
  • Don’t have to write the code for UICollectionViewDelegate and UICollectionViewDataSource protocols
  • Don’t need to care about cell identifier
  • Handle cell selection by trailing closure
  • Supports method chaining
  • Supports subscript
  • Complete example
Quick example
    // viewController swift file

    let sapporo = Sapporo(collectionView: self.collectionView)

    let cellmodel = YourCellModel(title: "Title", des: "description") {
        println("Did select cell with title = (title)")
    }

    let topSection = SASection()

    sapporo
        .reset(topSection)
        .bump()

    topSection
        .append(cellmodel)              // append a new cell model in datasource
        .bump()                         // show the new cell in the collection view

    topSection
        .remove(1...3)
        .bump()

    topSection
        .move(fromIndex: 0, toIndex: 3)
        .bump()
    // your cell swift file

    class YourCellModel : SACellModel {
        let title: String
        let des: String

        init(title: String, des: String, selectionHandler: SASelectionHandler) {
            self.title = title
            self.des = des
            super.init(cellType: YourCell.self, selectionHandler: selectionHandler)
        }
    }

    class YourCell : SACell, SACellType {
        typealias CellModel = YourCellModel

        @IBOutlet weak var titleLabel: UILabel!

        override func configure() {
            super.configure()

            guard let cellmodel = cellmodel else {
                return
            }

            titleLabel.text = cellmodel.title
        }
    }

Usage

  • Handling section
    // retrieve a section or create a new section if it doesn't already exist
    let section = sapporo[0]

    // inserting
    sapporo.insert(section, atIndex: 1)
           .bump()

    // moving
    sapporo.move(fromIndex: 1, toIndex: 5)
           .bump()

    // removing
    sapporo.remove(index)
           .bump()

    sapporo.reset()     // remove all data
           .bump()

    // handing section index by enum
    enum Section : Int, SectionIndex {
        case Top = 0
        case Center
        case Bottom

        var intValue: Int {
            return self.rawValue
        }
    }

    let topSection = sapporo[Section.Top]
  • Handling cell
    // appending
    sapporo[0]
        .append(cellmodel)              // append a cellmodel
        .bump()                         // and bump to show the cell in the collection view

    sapporo[TopSection]
        .append(cellmodels)     // append a list of cellmodels
        .bump()                 

    // by using section
    let section = sapporo[Section.Top]
    section
        .append(cellmodel)
        .bump()

    // 2. inserting
    section
        .insert(cellmodels, atIndex: 1)
        .bump()

    section
        .insertBeforeLast(cellmodels)
        .bump()

    // 3. reseting
    section
        .reset(cellmodels)              // replace current data in section by the new data
        .bump()

    section
        .reset()                            // or remove all data in section
        .bump()

    // 4. moving
    section
        .move(fromIndex: 5, toIndex: 1)
        .bump()

    // 5. removing
    section
        .remove(1)
        .bump()

    section
        .remove(cellmodel)
        .bump()

    section
        .remove(2...5)
        .bump()

    section
        .removeLast()
        .bump()

    // updating cell
    let cellmodel = section[1]
    cellmodel.property = newData
    cellmodel.bump()

    // able to retrieve a cellmodel by indexpath
    let cellmodel = sapporo[indexpath]
  • Registering cell, header, footer, reusable view
    sapporo
        .registerCellByNib(CustomCell)
        .registerCell(SimpleCell)
        .registerSupplementaryViewByNib(HeaderView.self, kind: "SectionHeader")
  • Customizing layout

In case you want to customize the layout of collection view, just create a subclass of SALayout and call setLayout method to set the new layout instance.

    class CustomLayout: SALayout {
        // the implementation for your layout
    }

    let layout = CustomLayout()
    sapporo.setLayout(layout)

Demo apps

Sapporo

Do you worry about the customizability when using Sapporo?
This is the answer for you, a calendar app implemented by using Sapporo.

Sapporo

Installation

  • Using Carthage

    • Insert github nghialv/Sapporo to your Cartfile
    • Run carthage update
  • Using CocoaPods

    • Insert followings to your Podfile
      
      use_frameworks!

    target ‘YOUR_TARGET_NAME’ do
    pod ‘Sapporo’
    end

    
    - Run `pod install`
  • Using submodule

Requirements

  • iOS 8.0+
  • Xcode 8+
  • Swift 3

License

Sapporo is released under the MIT License.

Latest podspec

{
    "name": "Sapporo",
    "version": "2.0",
    "summary": "cellmodel-driven collectionview manager",
    "homepage": "https://github.com/nghialv/Sapporo",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "authors": {
        "Le Van Nghia": "[email protected]"
    },
    "social_media_url": "https://twitter.com/nghialv2607",
    "platforms": {
        "ios": "8.0"
    },
    "source": {
        "git": "https://github.com/nghialv/Sapporo.git",
        "tag": "2.0"
    },
    "source_files": "Sapporo/*",
    "requires_arc": true,
    "pushed_with_swift_version": "3.0"
}

Pin It on Pinterest

Share This