diff --git a/StopWatch/Base.lproj/Main.storyboard b/StopWatch/Base.lproj/Main.storyboard index 1b6c085..a95f389 100644 --- a/StopWatch/Base.lproj/Main.storyboard +++ b/StopWatch/Base.lproj/Main.storyboard @@ -50,6 +50,9 @@ + + + @@ -89,6 +92,7 @@ + diff --git a/StopWatch/TimerModel.swift b/StopWatch/TimerModel.swift index d85e361..fd6e8aa 100644 --- a/StopWatch/TimerModel.swift +++ b/StopWatch/TimerModel.swift @@ -10,12 +10,16 @@ import Foundation protocol UpdateTime { func timeUpdated(_ interval: TimeInterval) + func lapsUpdated(_ laps: [TimeInterval]) } class TimerModel { var updateDelegate: UpdateTime? var startTime: Date? var timer: Timer? + var lapTime: Date? + + var laps: [TimeInterval] = [] init() { } @@ -29,6 +33,22 @@ class TimerModel { return Date().timeIntervalSince(startTime) } + func lap() -> Void { + guard let startTime = self.startTime else { + return + } + + let now = Date() + let baseTime = self.lapTime ?? startTime + let interval = now.timeIntervalSince(baseTime) + self.laps.append(interval) + + // we'll talk about this in detail later + DispatchQueue.main.async { + self.updateDelegate?.lapsUpdated(self.laps) + } + } + func startTimer() -> Void { self.startTime = Date() // don't worry about runloop details, we'll talk about it later diff --git a/StopWatch/ViewController.swift b/StopWatch/ViewController.swift index 3fcd0a2..931f14c 100644 --- a/StopWatch/ViewController.swift +++ b/StopWatch/ViewController.swift @@ -8,9 +8,49 @@ import UIKit -class ViewController: UIViewController, UpdateTime { +class ViewController: UIViewController, UpdateTime, UITableViewDataSource, UITableViewDelegate { + + func lapsUpdated(_ laps: [TimeInterval]) { + var displayLaps: [LapDisplay] = [] + for (index, lap) in laps.reversed().enumerated() { + displayLaps.append(LapDisplay(lapNumber: laps.count - index, lapTime: lap)) + } + self.laps = displayLaps + } + + + struct LapDisplay { + let lapNumber: Int + let lapTime: TimeInterval + } + + @IBOutlet weak var timeDisplayLabel: UILabel! + var laps: [LapDisplay]? + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + // by default there is one section for each tableview + return self.laps?.count ?? 0 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let laps = self.laps else { + return UITableViewCell() + } + + let lap = laps[indexPath.row] + + // the identifier is like the type of the cell + let cell = tableView.dequeueReusableCell(withIdentifier: "lapCell") ?? UITableViewCell(style: .subtitle, reuseIdentifier: "lapCell") + + // IMPORTANT: make sure to set all fields! + cell.textLabel?.text = "Lap \(lap.lapNumber)" + cell.detailTextLabel?.text = String(format: "%0.02f", lap.lapTime) + + return cell + } + func timeUpdated(_ interval: TimeInterval) { - print(interval) + self.timeDisplayLabel.text = String(format: "%0.02f", interval) } @@ -23,6 +63,10 @@ class ViewController: UIViewController, UpdateTime { self.timer.startTimer() } + @IBAction func lapButtonPressed() { + self.timer.lap() + } + func toggleButton(withTitles titles: (String, String), on button: UIButton) { let title = button.currentTitle == titles.0 ? titles.1 : titles.0 button.setTitle(title, for: .normal)