An open API service indexing awesome lists of open source software.

https://github.com/hackiftekhar/iqlistkit

Model driven UITableView/UICollectionView
https://github.com/hackiftekhar/iqlistkit

swift uicollectionview uitableview

Last synced: 5 months ago
JSON representation

Model driven UITableView/UICollectionView

Awesome Lists containing this project

README

          

# πŸ† **IQListKit**
Model-Driven `UITableView` and `UICollectionView` in Swift

![Insertion Sort](https://raw.githubusercontent.com/hackiftekhar/IQListKit/master/Documents/insertion_sort.gif)
![Conference Video Feed](https://raw.githubusercontent.com/hackiftekhar/IQListKit/master/Documents/conference_video_feed.gif)
![Orthogonal Section](https://raw.githubusercontent.com/hackiftekhar/IQListKit/master/Documents/orthogonal_section.gif)
![Mountains](https://raw.githubusercontent.com/hackiftekhar/IQListKit/master/Documents/mountains.gif)
![User List](https://raw.githubusercontent.com/hackiftekhar/IQListKit/master/Documents/users_list.gif)

[![Build Status](https://travis-ci.org/hackiftekhar/IQListKit.svg)](https://travis-ci.org/hackiftekhar/IQListKit)
[![CocoaPods](https://img.shields.io/cocoapods/v/IQListKit.svg)](http://cocoadocs.org/docsets/IQListKit)
[![Swift Version](https://img.shields.io/badge/Swift-5.7%2B-orange.svg)](https://www.swift.org/)
[![Platform](https://img.shields.io/badge/platform-iOS-blue)]()

---

## πŸš€ **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 `UITableView` and `UICollectionView`
- βœ… **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 `dequeueReusableCell` hassles

---

## πŸ“‹ **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**
1. Open Xcode β†’ File β†’ Add Package Dependency
2. Enter URL:
```
https://github.com/hackiftekhar/IQListKit.git
```
3. Select the version and install.

### ▢️ **CocoaPods**
Add to your `Podfile`:
```ruby
pod 'IQListKit'
```

### ▢️ **Manual Installation**
1. Clone the repository.
2. Drag and drop the `IQListKit` folder 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`:
```swift
struct User: Hashable {
let id: Int
let name: String
}
```

### **2️⃣ Create a Cell**
Create a cell that conforms to `IQModelableCell`:
```swift
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`:
```swift
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`:
```swift
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:
```swift
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:

```swift
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](https://github.com/hackiftekhar/IQListKit/blob/master/Documents/Delegate_DataSource_Guide.md)
- [Workaround Guide](https://github.com/hackiftekhar/IQListKit/blob/master/Documents/Workarounds.md)
- [IQListKit Presentation](https://raw.githubusercontent.com/hackiftekhar/IQListKit/master/Documents/IQListKitPresentation.pdf)
- [Modern Collection View](https://raw.githubusercontent.com/hackiftekhar/IQListKit/master/Documents/IQListKitWithModernCollectionView.pdf)

---

## πŸ† **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.

---

## πŸ‘¨β€πŸ’» **Author**
Iftekhar Qureshi
- GitHub Sponsors: [Support my open-source work](https://github.com/sponsors/hackiftekhar)
- PayPal: [PayPal](https://www.paypal.me/hackiftekhar)
- Buy Me a Coffee: [Support here](https://www.buymeacoffee.com/hackiftekhar)
- Twitter: [@hackiftekhar](https://twitter.com/hackiftekhar)
- Website: [hackiftekhar.com](https://hackiftekhar.com)

---

### ⭐️ **Star the repo on GitHub if you like it!**