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".
Generates complete reactive iOS list screens using RxSwift MVVM with Input/Output pattern. Activates when you say "create reactive list" or "generate rxswift list" to scaffold ViewModels, Controllers, Navigator, and tests with pagination.
/plugin marketplace add daispacy/py-claude-marketplace/plugin install py-plugin@py-claude-marketplaceThis skill is limited to using the following tools:
examples.mdtemplates.mdGenerates complete reactive iOS list screens using RxSwift MVVM Input/Output pattern with reactive pagination, pull-to-refresh, and infinite scroll for iOS reactive projects.
Use AskUserQuestion to collect configuration (present all questions at once):
Required Information:
Optional Information:
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
Generate these files in the specified feature_path:
[Feature]ViewModel.swift)From templates.md → Template 1: ViewModel
Key components:
[Feature]Filter: FilterPaginationDateRangeProviderBaseListPaginationDateRangeViewModel<DomainItem, Filter, Any>transform() methodfetchItems(_ toDate: Date) for paginationCritical patterns:
[weak self] in all closures.disposed(by: disposeBag).catchSessionError(sessionUC) (inherited from base)Driver for all outputs (UI-safe)Observable for all inputs[Feature]Controller.swift)From templates.md → Template 2: ViewController
Key components:
BaseViewControllerviewDidLoad() setupsetupUI() - register cells, configure tablebindViewModel() - create Input, transform, bind OutputCritical patterns:
registerCellByNibshowError()navigator.navigate(to:)Navigator+[Feature].swift)From templates.md → Template 3: Navigator
Key components:
[Feature]NavigatorType[Feature]Destination with all navigation casesNavigator: [Feature]NavigatorTypeviewControllerFactory[Feature]ViewModelTests.swift)From templates.md → Template 4: Unit Tests
Key components:
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
}
}
Before presenting results, verify:
Domain, RxSwift, RxCocoa[weak self]disposeBagPresent 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 YES
Navigate 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.