125 lines
3.9 KiB
Swift
125 lines
3.9 KiB
Swift
|
//
|
||
|
// MainViewController.swift
|
||
|
// HackerNews
|
||
|
//
|
||
|
// Copyright (c) 2014 Amit Burstein. All rights reserved.
|
||
|
// See LICENSE for licensing information.
|
||
|
//
|
||
|
// Abstract:
|
||
|
// Handles fetching and displaying posts from Hacker News.
|
||
|
//
|
||
|
|
||
|
import UIKit
|
||
|
import QuartzCore
|
||
|
|
||
|
class MainViewController: UIViewController, UITableViewDataSource {
|
||
|
|
||
|
// MARK: Properties
|
||
|
|
||
|
let postCellIdentifier = "PostCell"
|
||
|
let showBrowserIdentifier = "ShowBrowser"
|
||
|
var postFilter = PostFilterType.Top
|
||
|
var posts = HNPost[]()
|
||
|
var refreshControl = UIRefreshControl()
|
||
|
@IBOutlet var tableView: UITableView
|
||
|
|
||
|
// MARK: Lifecycle
|
||
|
|
||
|
override func viewDidLoad() {
|
||
|
super.viewDidLoad()
|
||
|
configureUI()
|
||
|
fetchPosts()
|
||
|
}
|
||
|
|
||
|
override func viewWillAppear(animated: Bool) {
|
||
|
tableView.deselectRowAtIndexPath(tableView.indexPathForSelectedRow(), animated: animated)
|
||
|
super.viewWillAppear(animated)
|
||
|
}
|
||
|
|
||
|
// MARK: Functions
|
||
|
|
||
|
func configureUI() {
|
||
|
refreshControl.addTarget(self, action: "fetchPosts", forControlEvents: .ValueChanged)
|
||
|
refreshControl.attributedTitle = NSAttributedString(string: "Pull to Refresh")
|
||
|
tableView.insertSubview(refreshControl, atIndex: 0)
|
||
|
}
|
||
|
|
||
|
func fetchPosts() {
|
||
|
UIApplication.sharedApplication().networkActivityIndicatorVisible = true;
|
||
|
|
||
|
HNManager.sharedManager().loadPostsWithFilter(postFilter, completion: { posts in
|
||
|
if (posts != nil && posts.count > 0) {
|
||
|
self.posts = posts as HNPost[]
|
||
|
dispatch_async(dispatch_get_main_queue(), {
|
||
|
self.tableView.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Fade)
|
||
|
self.refreshControl.endRefreshing()
|
||
|
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
|
||
|
})
|
||
|
} else {
|
||
|
println("Could not fetch posts!")
|
||
|
self.refreshControl.endRefreshing()
|
||
|
UIApplication.sharedApplication().networkActivityIndicatorVisible = false;
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func stylePostCellAsRead(cell: UITableViewCell) {
|
||
|
cell.textLabel.textColor = UIColor(red: 119/255.0, green: 119/255.0, blue: 119/255.0, alpha: 1)
|
||
|
cell.detailTextLabel.textColor = UIColor(red: 153/255.0, green: 153/255.0, blue: 153/255.0, alpha: 1)
|
||
|
}
|
||
|
|
||
|
// MARK: UITableViewDataSource
|
||
|
|
||
|
func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
|
||
|
return posts.count
|
||
|
}
|
||
|
|
||
|
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
|
||
|
let cell = tableView.dequeueReusableCellWithIdentifier(postCellIdentifier) as UITableViewCell
|
||
|
|
||
|
let post = posts[indexPath.row]
|
||
|
|
||
|
if HNManager.sharedManager().hasUserReadPost(post) {
|
||
|
stylePostCellAsRead(cell)
|
||
|
}
|
||
|
|
||
|
cell.textLabel.text = post.Title
|
||
|
cell.detailTextLabel.text = "\(post.Points) points by \(post.Username)"
|
||
|
|
||
|
return cell
|
||
|
}
|
||
|
|
||
|
// MARK: UIViewController
|
||
|
|
||
|
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject) {
|
||
|
if segue.identifier == showBrowserIdentifier {
|
||
|
let webView = segue.destinationViewController as BrowserViewController
|
||
|
let cell = sender as UITableViewCell
|
||
|
let post = posts[tableView.indexPathForCell(cell).row]
|
||
|
|
||
|
HNManager.sharedManager().setMarkAsReadForPost(post)
|
||
|
stylePostCellAsRead(cell)
|
||
|
|
||
|
webView.post = post
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MARK: IBActions
|
||
|
|
||
|
@IBAction func changePostFilter(sender: UISegmentedControl) {
|
||
|
switch sender.selectedSegmentIndex {
|
||
|
case 0:
|
||
|
postFilter = .Top
|
||
|
fetchPosts()
|
||
|
case 1:
|
||
|
postFilter = .New
|
||
|
fetchPosts()
|
||
|
case 2:
|
||
|
postFilter = .Ask
|
||
|
fetchPosts()
|
||
|
default:
|
||
|
println("Bad segment index!")
|
||
|
}
|
||
|
}
|
||
|
}
|