hackiftekhar/iqlistkit
Model-Driven `UITableView` and `UICollectionView` in Swift
π **Why IQListKit?**
IQListKit simplifies working with UITableView and UICollectionView by eliminating the need to implement dataSource methods manually. Just define your sections, models, and cell types β IQListKit takes care of the rest, including: β
Automatic diffing and animations β
Clean and reusable code β
Single API for both UITableView and UICollectionView
π― **Features**
- β
Unified API β Works with both
UITableViewandUICollectionView - β Diffable Data Source β Smooth animations and state updates
- β Declarative Syntax β Cleaner and more concise code
- β Custom Headers/Footers β Easy to implement and manage
- β
Reusable Cells β No more
dequeueReusableCellhassles
π **Requirements**
| Version | Swift | iOS Target | Xcode Version | |---------|-------|------------|---------------| | IQListKit 1.1.0 | Swift 5.7+ | iOS 9.0+ | Xcode 11+ | | IQListKit 4.0.0+ | Swift 5.7+ | iOS 13.0+ | Xcode 14+ | | IQListKit 5.0.0+ | Swift 5.7+ | iOS 13.0+ | Xcode 14+ |
π¦ **Installation**
βΆοΈ Swift Package Manager
- Open Xcode β File β Add Package Dependency
- Enter URL:
`` https://github.com/hackiftekhar/IQListKit.git ``
- Select the version and install.
βΆοΈ CocoaPods
Add to your Podfile:
pod 'IQListKit'βΆοΈ Manual Installation
- Clone the repository.
- Drag and drop the
IQListKitfolder into your project.
π οΈ **How to Use IQListKit**
Letβs build a user list in 5 simple steps!
1οΈβ£ Create a Model
Make sure your model conforms to Hashable:
struct User: Hashable {
let id: Int
let name: String
}2οΈβ£ Create a Cell
Create a cell that conforms to IQModelableCell:
class UserCell: UITableViewCell, IQModelableCell {
@IBOutlet var nameLabel: UILabel!
struct Model: Hashable {
let user: User
}
var model: Model? {
didSet {
nameLabel.text = model?.user.name
}
}
}3οΈβ£ Set Up the List
Create a list in your UIViewController:
class UsersViewController: UIViewController {
private lazy var list = IQList(listView: tableView, delegateDataSource: self)
private var users = [User(id: 1, name: "John"), User(id: 2, name: "Jane")]
override func viewDidLoad() {
super.viewDidLoad()
loadData()
}
}4οΈβ£ Provide Data
Provide data directly to IQListKit:
func loadData() {
list.reloadData { [users] builder in
let section = IQSection(identifier: "Users")
builder.append([section])
let models: [UserCell.Model] = users.map { .init(user: $0) }
builder.append(UserCell.self, models: models, section: section)
}
}5οΈβ£ Handle Selection
Handle user selection easily:
extension UsersViewController: IQListViewDelegateDataSource {
func listView(_ listView: IQListView, didSelect item: IQItem, at indexPath: IndexPath) {
if let model = item.model as? UserCell.Model {
print("Selected user: \(model.user.name)")
}
}
}π§° **Using the Wrapper Class**
If you would like to display a single-section list of similar objects in a UITableView or UICollectionView, IQListKit provides a convenient IQListWrapper class to handle all the boilerplate code for you.
βΆοΈ Setup with IQListWrapper
You can set up IQListWrapper in just a few lines of code:
class UsersViewController: UIViewController {
@IBOutlet var tableView: UITableView!
private lazy var listWrapper = IQListWrapper(listView: tableView,
type: UserCell.self,
registerType: .nib,
delegateDataSource: self)
private var users = [User(id: 1, name: "John"), User(id: 2, name: "Jane")]
override func viewDidLoad() {
super.viewDidLoad()
loadData()
}
func loadData() {
listWrapper.setModels(users, animated: true, completion: nil)
}
}The IQListWrapper class reduces complexity by handling the setup and data binding automatically, making it ideal for quick implementations!
π **Documentation**
- Delegate, DataSource and Cell Configuration Guide
- Workaround Guide
- IQListKit Presentation
- Modern Collection View
π **Best Practices**
- Always handle cell reuse correctly to avoid glitches.
- Use lightweight models for better memory usage.
β€οΈ **Contributions**
Contributions are welcome!
- Report issues
- Submit pull requests
- Improve documentation
π **License**
IQListKit is distributed under the MIT license.
Package Metadata
Repository: hackiftekhar/iqlistkit
Default branch: master
README: README.md