Skip to content

Instantly share code, notes, and snippets.

@giln
Created May 6, 2019 09:53
Show Gist options
  • Save giln/32bdb401717a691408fad9b045bc2bb4 to your computer and use it in GitHub Desktop.
Save giln/32bdb401717a691408fad9b045bc2bb4 to your computer and use it in GitHub Desktop.
import PlaygroundSupport
import UIKit
@testable import MVCMovieInfoFramework
NSSetUncaughtExceptionHandler { exception in
print("💥 Exception thrown: \(exception)")
}
PlaygroundPage.current.needsIndefiniteExecution = true
public protocol Listable {
var firstText: String { get }
var secondText: String { get }
var thirdText: String { get }
var fourthText: String { get }
var imageUrl: URL { get }
}
public extension ImageWithFourLabelView {
func configure(with element: Listable) {
firstLabel.text = element.firstText
secondLabel.text = element.secondText
thirdLabel.text = element.thirdText
fourthLabel.text = element.fourthText
imageView.url = element.imageUrl
}
}
open class ListViewController: UITableViewController {
// MARK: - Variables
open var list = [Listable]() {
didSet {
tableView.reloadData()
}
}
// MARK: Lifecycle
open override func viewDidLoad() {
super.viewDidLoad()
setupTableView()
}
private func setupTableView() {
tableView.tableFooterView = UIView()
tableView.register(ImageWithFourLabelCell.self, forCellReuseIdentifier: ImageWithFourLabelCell.defaultReuseIdentifier)
tableView.rowHeight = UITableView.automaticDimension
}
// MARK: - TableViewDataSource
open override func tableView(_: UITableView, numberOfRowsInSection _: Int) -> Int {
return list.count
}
open override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: ImageWithFourLabelCell.defaultReuseIdentifier, for: indexPath) as! ImageWithFourLabelCell
let element = list[indexPath.row]
cell.layout.configure(with: element)
return cell
}
}
extension Movie: Listable {
private static let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
return formatter
}()
public var firstText: String {
return title
}
public var secondText: String {
return overview
}
public var thirdText: String {
return Movie.dateFormatter.string(from: releaseDate)
}
public var fourthText: String {
let rating = Int(voteAverage)
let ratingText = (0 ..< rating).reduce("") { (acc, _) -> String in
return acc + "⭐️"
}
return ratingText
}
public var imageUrl: URL {
return posterURL
}
}
let listController = ListViewController()
let movieStore = MovieStore.shared
movieStore.fetchMovies(from: .topRated, params: nil, successHandler: { moviesResponse in
print(moviesResponse)
listController.list = moviesResponse.results
}) { error in
print(error)
}
PlaygroundPage.current.liveView = listController
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment