| name | ios-reactive-list-generator |
| description | Generate reactive iOS list screens with RxSwift MVVM Input/Output pattern. Creates complete list features with reactive bindings, pagination (date range/page number), ViewModel, ViewController, Navigator, and tests for iOS reactive projects. Use when "create reactive list", "generate reactive list", "new reactive list screen", "create rxswift list", or "generate list with rxswift". |
| allowed-tools | Read, Write, Edit, Glob, Grep, AskUserQuestion |
iOS Reactive List Generator
Generates complete reactive iOS list screens using RxSwift MVVM Input/Output pattern with reactive pagination, pull-to-refresh, and infinite scroll for iOS reactive projects.
When to Activate
- "create reactive list"
- "generate reactive list"
- "new reactive list screen"
- "create rxswift list"
- "generate list with rxswift"
- "new reactive table view"
- "create ios reactive list"
- "generate reactive list with pagination"
- "new list with reactive bindings"
Generation Process
Step 1: Collect Feature Requirements
Use AskUserQuestion to collect configuration (present all questions at once):
Required Information:
- Feature name (CamelCase, e.g., "TransactionHistory")
- Feature path (e.g., "PayooMerchant/Controllers/Transaction/History")
- Feature display title (for navigation bar)
- Pagination type: "date_range", "page_number", or "none"
- Primary UseCase name (e.g., "TransactionHistoryUseCaseType")
- Primary UseCase main method (e.g., "getTransactions(fromDate:toDate:)")
- Domain model item type (e.g., "TransactionItem")
- Main content cell class (e.g., "TransactionCell")
Optional Information:
- Additional UseCases (comma-separated)
- Custom Input triggers beyond standard (load, loadMore, refresh, selectItem)
- Custom Output drivers beyond standard (items, isLoading, shouldLoadMore, error)
- Header cells (comma-separated class names)
- Additional navigation destinations
Step 2: Read Reference Implementations
Read these files to extract patterns:
# Core reference implementations
PayooMerchant/Controllers/Balance/Information/BalanceInformationViewModel.swift
PayooMerchant/Controllers/Balance/Information/BalanceInformationController.swift
PayooMerchant/Controllers/History/BaseListTransaction/BaseListPaginateDateRangeViewModel.swift
# Form template
/Users/homac34/payoo-ios-app-merchant/PRESENTATION_LAYER_FORM.md
Step 3: Generate Files
Generate these files in the specified feature_path:
1. ViewModel ([Feature]ViewModel.swift)
From templates.md → Template 1: ViewModel
Key components:
- Import Domain module
- Struct
[Feature]Filter: FilterPaginationDateRangeProvider - Class extending
BaseListPaginationDateRangeViewModel<DomainItem, Filter, Any> - Input struct with all triggers
- Output struct with all drivers
transform()method- Override
fetchItems(_ toDate: Date)for pagination
Critical patterns:
- Use
[weak self]in all closures - All subscriptions use
.disposed(by: disposeBag) - API calls use
.catchSessionError(sessionUC)(inherited from base) - Use
Driverfor all outputs (UI-safe) - Use
Observablefor all inputs
2. ViewController ([Feature]Controller.swift)
From templates.md → Template 2: ViewController
Key components:
- Extend
BaseViewController - IBOutlet for tableView
- PublishSubject triggers matching Input
viewDidLoad()setupsetupUI()- register cells, configure tablebindViewModel()- create Input, transform, bind Output
Critical patterns:
- Pull-to-refresh setup
- Infinite scroll detection (last 3 items)
- Cell registration with
registerCellByNib - Error handling with
showError() - Navigation via
navigator.navigate(to:)
3. Navigator Extension (Navigator+[Feature].swift)
From templates.md → Template 3: Navigator
Key components:
- Protocol
[Feature]NavigatorType - Enum
[Feature]Destinationwith all navigation cases - Extension
Navigator: [Feature]NavigatorType - Implementation using
viewControllerFactory
4. Unit Tests ([Feature]ViewModelTests.swift)
From templates.md → Template 4: Unit Tests
Key components:
- RxTest with TestScheduler
- Mock UseCases and Navigator
- Test cases for load, loadMore, refresh, selection
- Memory leak test (weak self verification)
Step 4: Generate DI Registration Instructions
Create markdown instructions for manual updates:
File: DependencyContainer.swift
// Register ViewModel
container.register([Feature]ViewModel.self) { resolver in
[Feature]ViewModel(
[feature]UC: resolver.resolve([PrimaryUseCase].self)!,
navigator: resolver.resolve([Feature]NavigatorType.self)!
)
}
File: ViewControllerFactory extension
extension ViewControllerFactory {
func make[Feature]Controller() -> [Feature]Controller {
let controller = [Feature]Controller.instantiate()
controller.viewModel = DependencyContainer.shared.provide([Feature]ViewModel.self)
return controller
}
}
Step 5: Validation Checklist
Before presenting results, verify:
- ✓ All generated files use correct feature name
- ✓ Import statements include
Domain,RxSwift,RxCocoa - ✓ ViewModel extends correct base class for pagination type
- ✓ All closures use
[weak self] - ✓ All subscriptions disposed with
disposeBag - ✓ Cell classes match existing cells (verify with Glob)
- ✓ Navigator protocol and enum follow naming conventions
- ✓ File paths are absolute and correct
Output Format
Present results as:
✅ iOS Feature Generated: [FeatureName]
📁 Files Created:
- [feature_path]/[Feature]ViewModel.swift
- [feature_path]/[Feature]Controller.swift
- [feature_path]/Navigator+[Feature].swift
- PayooMerchantTests/ViewModel/[Feature]ViewModelTests.swift
📋 Manual Steps Required:
1. **Register in DependencyContainer.swift**
[Show code snippet]
2. **Add factory method to ViewControllerFactory**
[Show code snippet]
3. **Update parent Navigator** (if adding to existing flow)
[Show navigation destination enum case]
4. **Create XIB file** (optional)
- File → New → View
- Name: [Feature]Controller.xib
- Set File's Owner to [Feature]Controller
- Connect tableView outlet
🧪 Test the Feature:
1. Build project:
```bash
xcodebuild -workspace PayooMerchant.xcworkspace \
-scheme "Payoo Merchant Sandbox" \
-configuration "Debug Sandbox" \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,OS=17.5,name=iPhone 15,arch=x86_64' \
clean build
Run tests:
xcodebuild test \ -workspace PayooMerchant.xcworkspace \ -scheme "PayooMerchantTests" \ -configuration "Debug Sandbox" \ -destination 'platform=iOS Simulator,OS=17.5,name=iPhone 15,arch=x86_64' \ -enableCodeCoverage YESNavigate to feature:
navigator.navigate(to: .[featureName]())
⏱️ Estimated completion time: 15-30 minutes (manual steps)
## Key Patterns Reference
### Date Range Pagination
- Filter conforms to `FilterPaginationDateRangeProvider`
- Domain item conforms to `PaginationDateRangeProvider`
- Uses item's `createdDate` as cursor for next page
- `toDate` becomes last item's date on load more
### RxSwift Memory Safety
- Always `[weak self]` in closures
- Always `.disposed(by: disposeBag)`
- Use `Driver` (never fails, main thread) for UI
- Use `Observable` for inputs
### Navigation Pattern
- Protocol defines interface
- Enum defines destinations with associated values
- Navigator extension implements using factory
---
See `templates.md` for complete code templates.
See `examples.md` for full generated feature example.