iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
テーブルビュー関連のコードを切り離す。
SourceTypeというプロトコルを作り、プロトコルエクステンションとして中身を実装する。
protocol SourceType: UITableViewDataSource {
func insertTopRowIn(tableView: UITableView)
func deleteRowAtIndexPath(indexPath: NSIndexPath, from tableView: UITableView)
}
extension SourceType {
func insertTopRowIn(tableView: UITableView) {
let indexPath = IndexPath(row: 0, section: 0)
tableView.insertRows(at: [indexPath], with: .fade)
}
func deleteRowAtIndexPath(indexPath: NSIndexPath, from tableView: UITableView) {
tableView.deleteRows(at: [indexPath as IndexPath], with: .fade)
}
}
データソースクラスに組み込む。
class DataSource: NSObject, UITableViewDataSource, SourceType {
private var document = Document.sharedInstance
func addItemTo(tableView: UITableView) {
if document.numberOfCards < 5 {
document.addNewCard(at: 0)
insertTopRowIn(tableView: tableView)
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return document.numberOfCards
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CardCell
let card = document.getCard(at: indexPath.row)
cell.fillWith(card: card)
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
document.deleteCard(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}
}