1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
//
// ForayTableViewController.swift
// foray
//
// Created by Nicholas Tay on 14/3/2022.
//
import UIKit
struct MyItem {
var releaseDate: Date
var id: String
var name: String
}
struct YearSection {
var year: Date
var items: [MyItem]
}
class ForayTableViewCell: UITableViewCell {
@IBOutlet weak var cellItemName: UILabel!
@IBOutlet weak var cellItemSubtitle: UILabel!
@IBOutlet weak var cellItemImage: UIImageView!
}
// copied from sample project
private func parseDate(_ str : String) -> Date {
let dateFormat = DateFormatter()
dateFormat.dateFormat = "yyyy-MM-dd"
return dateFormat.date(from: str)!
}
private func firstDayOfYear(date: Date) -> Date {
let calendar = Calendar.current
let components = calendar.dateComponents([.year], from: date)
return calendar.date(from: components)!
}
class ForayTableViewController: UITableViewController {
// MARK: - Static data TEMP
let items = [
MyItem(releaseDate: parseDate("2006-05-26"), id: "mh", name: "Miners Helmet"),
MyItem(releaseDate: parseDate("2010-05-01"), id: "it", name: "Inner Tube"),
MyItem(releaseDate: parseDate("2009-04-24"), id: "tbg", name: "Toboggan"),
MyItem(releaseDate: parseDate("2006-03-29"), id: "spy", name: "Spy Phone"),
MyItem(releaseDate: parseDate("2008-11-18"), id: "bnb", name: "Black Ninja Belt"),
]
var sections = [YearSection]()
// MARK: - On load
override func viewDidLoad() {
super.viewDidLoad()
let groups = Dictionary(grouping: self.items) { (item) in
return firstDayOfYear(date: item.releaseDate)
}
self.sections = groups.map { (key, values) in
return YearSection(year: key, items: values)
}
// Sort the sections from oldest year to newest
self.sections.sort { (lhs, rhs) in lhs.year < rhs.year }
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// Returns number of sections for table
return self.sections.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// Returns number of rows for table's section
return self.sections[section].items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "ForayCell", for: indexPath) as! ForayTableViewCell
let item = self.sections[indexPath.section].items[indexPath.row]
cell.cellItemName?.text = item.name
cell.cellItemSubtitle?.text = "Item ID: \(item.id)"
cell.cellItemImage?.image = UIImage(named: item.id)
return cell
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let section = self.sections[section]
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy"
return "Released in " + dateFormatter.string(from: section.year)
}
}
|