156 lines
5.4 KiB
Swift
156 lines
5.4 KiB
Swift
//
|
|
// SectionedViewType.swift
|
|
// RxExample
|
|
//
|
|
// Created by Krunoslav Zaher on 6/27/15.
|
|
// Copyright (c) 2015 Krunoslav Zaher. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
func indexSet(values: [Int]) -> NSIndexSet {
|
|
let indexSet = NSMutableIndexSet()
|
|
for i in values {
|
|
indexSet.addIndex(i)
|
|
}
|
|
return indexSet
|
|
}
|
|
|
|
extension UITableView : SectionedViewType {
|
|
func insertItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation) {
|
|
self.insertRowsAtIndexPaths(paths, withRowAnimation: animationStyle)
|
|
}
|
|
|
|
func deleteItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation) {
|
|
self.deleteRowsAtIndexPaths(paths, withRowAnimation: animationStyle)
|
|
}
|
|
|
|
func moveItemAtIndexPath(from: NSIndexPath, to: NSIndexPath) {
|
|
self.moveRowAtIndexPath(from, toIndexPath: to)
|
|
}
|
|
|
|
func reloadItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation) {
|
|
self.reloadRowsAtIndexPaths(paths, withRowAnimation: animationStyle)
|
|
}
|
|
|
|
func insertSections(sections: [Int], animationStyle: UITableViewRowAnimation) {
|
|
self.insertSections(indexSet(sections), withRowAnimation: animationStyle)
|
|
}
|
|
|
|
func deleteSections(sections: [Int], animationStyle: UITableViewRowAnimation) {
|
|
self.deleteSections(indexSet(sections), withRowAnimation: animationStyle)
|
|
}
|
|
|
|
func moveSection(from: Int, to: Int) {
|
|
self.moveSection(from, toSection: to)
|
|
}
|
|
|
|
func reloadSections(sections: [Int], animationStyle: UITableViewRowAnimation) {
|
|
self.reloadSections(indexSet(sections), withRowAnimation: animationStyle)
|
|
}
|
|
|
|
func performBatchUpdates<S: SectionModelType>(changes: Changeset<S>) {
|
|
self.beginUpdates()
|
|
_performBatchUpdates(self, changes: changes)
|
|
self.endUpdates()
|
|
}
|
|
}
|
|
|
|
extension UICollectionView : SectionedViewType {
|
|
func insertItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation) {
|
|
self.insertItemsAtIndexPaths(paths)
|
|
}
|
|
|
|
func deleteItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation) {
|
|
self.deleteItemsAtIndexPaths(paths)
|
|
}
|
|
|
|
func moveItemAtIndexPath(from: NSIndexPath, to: NSIndexPath) {
|
|
self.moveItemAtIndexPath(from, toIndexPath: to)
|
|
}
|
|
|
|
func reloadItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation) {
|
|
self.reloadItemsAtIndexPaths(paths)
|
|
}
|
|
|
|
func insertSections(sections: [Int], animationStyle: UITableViewRowAnimation) {
|
|
self.insertSections(indexSet(sections))
|
|
}
|
|
|
|
func deleteSections(sections: [Int], animationStyle: UITableViewRowAnimation) {
|
|
self.deleteSections(indexSet(sections))
|
|
}
|
|
|
|
func moveSection(from: Int, to: Int) {
|
|
self.moveSection(from, toSection: to)
|
|
}
|
|
|
|
func reloadSections(sections: [Int], animationStyle: UITableViewRowAnimation) {
|
|
self.reloadSections(indexSet(sections))
|
|
}
|
|
|
|
func performBatchUpdates<S: SectionModelType>(changes: Changeset<S>) {
|
|
self.performBatchUpdates({ () -> Void in
|
|
_performBatchUpdates(self, changes: changes)
|
|
}, completion: { (completed: Bool) -> Void in
|
|
})
|
|
}
|
|
}
|
|
|
|
protocol SectionedViewType {
|
|
func insertItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation)
|
|
func deleteItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation)
|
|
func moveItemAtIndexPath(from: NSIndexPath, to: NSIndexPath)
|
|
func reloadItemsAtIndexPaths(paths: [NSIndexPath], animationStyle: UITableViewRowAnimation)
|
|
|
|
func insertSections(sections: [Int], animationStyle: UITableViewRowAnimation)
|
|
func deleteSections(sections: [Int], animationStyle: UITableViewRowAnimation)
|
|
func moveSection(from: Int, to: Int)
|
|
func reloadSections(sections: [Int], animationStyle: UITableViewRowAnimation)
|
|
|
|
func performBatchUpdates<S>(changes: Changeset<S>)
|
|
}
|
|
|
|
func setFor<E, K>(items: [E], transform: E -> K) -> [K : K] {
|
|
var res = [K : K]()
|
|
|
|
for i in items {
|
|
let k = transform(i)
|
|
res[k] = k
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
func _performBatchUpdates<V: SectionedViewType, S: SectionModelType>(view: V, changes: Changeset<S>) {
|
|
typealias I = S.Item
|
|
let rowAnimation = UITableViewRowAnimation.Automatic
|
|
|
|
view.deleteSections(changes.deletedSections, animationStyle: rowAnimation)
|
|
view.reloadSections(changes.updatedSections, animationStyle: rowAnimation)
|
|
view.insertSections(changes.insertedSections, animationStyle: rowAnimation)
|
|
for (from, to) in changes.movedSections {
|
|
view.moveSection(from, to: to)
|
|
}
|
|
|
|
view.deleteItemsAtIndexPaths(
|
|
changes.deletedItems.map { NSIndexPath(forItem: $0.itemIndex, inSection: $0.sectionIndex) },
|
|
animationStyle: rowAnimation
|
|
)
|
|
view.insertItemsAtIndexPaths(
|
|
changes.insertedItems.map { NSIndexPath(forItem: $0.itemIndex, inSection: $0.sectionIndex) },
|
|
animationStyle: rowAnimation
|
|
)
|
|
view.reloadItemsAtIndexPaths(
|
|
changes.updatedItems.map { NSIndexPath(forItem: $0.itemIndex, inSection: $0.sectionIndex) },
|
|
animationStyle: rowAnimation
|
|
)
|
|
|
|
for (from, to) in changes.movedItems {
|
|
view.moveItemAtIndexPath(
|
|
NSIndexPath(forItem: from.itemIndex, inSection: from.sectionIndex),
|
|
to: NSIndexPath(forItem: to.itemIndex, inSection: to.sectionIndex)
|
|
)
|
|
}
|
|
} |