Read more about latest 11.0 release and integration with SwiftUI!
If you need Xcode 11 support or Swift 4...Swift 5.2, or iOS 8...iOS 10 support, you can use 7.x releases.
Add package into Xcode Project settings -> Swift Packages
pod 'DTTableViewManager', '~> 11.0.0'
Let's say you have an array of Posts you want to display in UITableView. To quickly show them using DTTableViewManager, here's what you need to do:
ModelTransfer
protocol:class PostCell : UITableViewCell, ModelTransfer {
func update(with model: Post) {
// Fill your cell with actual data
}
}
class PostsViewController: UITableViewController, DTTableViewManageable {
override func viewDidLoad() {
super.viewDidLoad()
// Register PostCell to be used with this controller's table view
manager.register(PostCell.self)
// Populate datasource
manager.memoryStorage.setItems(posts)
}
}
Make sure your UITableView outlet is wired to your class (or use UITableViewController subclass). If you have a PostCell.xib file, it will be automatically used for dequeueing PostCell.
Of course, cool stuff does not stop there, framework supports all datasource and delegate methods as closures, conditional mappings and much much more! Choose what interests you in the next section of readme.
UITableView
?link |
Stars: 453 |
Last commit: 1 year ago |
UITableViewDelegate.tableView(_:canPerformPrimaryActionForRowAt:)
and UITableViewDelegate.tableView(_:performPrimaryActionForRowAt:)
delegate methods on iOS 16 and tvOS 16.UIHostingConfiguration
on iOS 16 / tvOS 16 / macCatalyst 16:manager.registerHostingConfiguration(for: Post.self) { _, post, _ in
UIHostingConfiguration {
PostView(post: post)
}
}
It's also possible to incorporate UIKit cell states by simply adding additional parameter to registration:
manager.registerHostingConfiguration(for: Post.self) { state, _, post, _ in
UIHostingConfiguration {
PostView(post: post, isSelected: state.isSelected)
}
}
UITableViewDataSourcePrefetching
protocol.manager.register(PostCell.self) { mapping in
mapping.prefetch { model, indexPath in }
mapping.cancelPrefetch { model, indexPath in }
}
Please note, that while datasource methods are called once per array of indexPaths, events for models will be called individually, so single model (and indexPath) is passed to each event. Theoretically, this should make prefetching and cancellation easier, since you no longer need to walk through array and find all data models, you can operate on a single data model at a time.
DTTableViewManager
are soft-deprecated. Please use events in mapping instead:Deprecated:
manager.register(PostCell.self)
manager.didSelect(PostCell.self) { postCell, post, indexPath in }
Recommended:
manager.register(PostCell.self) { mapping in
mapping.didSelect { postCell, post, indexPath in }
}
While previously main benefits for second syntax were mostly syntactic, now with support for SwiftUI it will be hard to actually specialize hosting cells (and might be impossible when iOS 16 hosting configuration is supported), so only second syntax will work for all kinds of cells, and first syntax can only work for non-SwiftUI cells. New delegate methods for UITableView (starting with iOS 16 / tvO 16 SDK) will be added only as extension to mapping protocols, not DTTableViewManager itself.
Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics