Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // TableViewController.swift
- // CheapEat
- //
- // Created by Johnathon Moss on 14/01/2015.
- // Copyright (c) 2015 CheapEat. All rights reserved.
- //
- import UIKit
- import CoreLocation
- class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, CLLocationManagerDelegate {
- @IBOutlet weak var tableView: UITableView!
- @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
- @IBOutlet weak var noDealsFoundLabel: UILabel!
- @IBOutlet weak var activityBG: UIImageView!
- var deals:[Deal] = [Deal]()
- let model:DealModel = DealModel()
- var imageCache = [String : UIImage]()
- var lat:String = ""
- var lng:String = ""
- var locationManager = CLLocationManager()
- // Values for nextView
- var restaurantDictionarys = [NSDictionary]()
- var ids = [String]()
- var restaurantsName = [String]()
- var restaurantsAdd = [String]()
- var venueInfo = [String]()
- var resLats = [String]()
- var resLng = [String]()
- var resPhone = [String]()
- var i = 0
- override func viewDidLoad() {
- super.viewDidLoad()
- self.tableView.dataSource = self
- self.tableView.delegate = self
- // Do any additional setup after loading the view.
- // Set nav bar title (so back button says "Deals")
- self.navigationItem.title = "Deals"
- activityIndicator.hidden = false
- activityBG.hidden = false
- // Core Location
- locationManager.delegate = self
- locationManager.desiredAccuracy = kCLLocationAccuracyBest
- locationManager.requestWhenInUseAuthorization()
- locationManager.startUpdatingLocation()
- //add logo to nav bar
- let navBarLogo: UIImageView = UIImageView(frame: CGRectMake(0, 0, 120, 36))
- navBarLogo.image = UIImage(named: "logo")
- self.navigationItem.titleView = navBarLogo
- self.tableView.delegate = self
- self.tableView.dataSource = self
- //remove table view insets
- self.tableView.layoutMargins = UIEdgeInsetsZero
- }
- func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
- self.performSegueWithIdentifier("Detail", sender: self)
- }
- override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
- if (segue.identifier == "Detail") {
- var viewController = segue.destinationViewController as VenueDetailViewController
- let indexPath = self.tableView.indexPathForSelectedRow()?.row
- println(indexPath)
- }
- }
- func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
- var userLocation:CLLocation = locations[0] as CLLocation
- var latitude:String = "-34.4232722"//"\(userLocation.coordinate.latitude)"
- var longitude:String = "150.8865837"//"\(userLocation.coordinate.longitude)"
- // var latitude:String = "\(userLocation.coordinate.latitude)"
- // var longitude:String = "\(userLocation.coordinate.longitude)"
- locationManager.stopUpdatingLocation()
- self.lat = latitude
- self.lng = longitude
- println(self.lat)
- println(self.lng)
- // Get the deals from the deal model
- self.deals = getDeals()
- if self.deals.count > 0 {
- activityIndicator.stopAnimating()
- activityIndicator.hidden = true
- activityBG.hidden = true
- self.tableView.reloadData()
- }
- else {
- noDealsFoundLabel.hidden = false
- activityIndicator.stopAnimating()
- activityIndicator.hidden = true
- activityBG.hidden = true
- }
- }
- func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
- println(error)
- activityIndicator.stopAnimating()
- activityIndicator.hidden = true
- activityBG.hidden = true
- var alert = UIAlertController(title: "Location issue", message: "Sorry, we need to know your location to show you the nearest deals. Please turn on location services for CheapEat in settings.", preferredStyle: UIAlertControllerStyle.Alert)
- alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
- self.presentViewController(alert, animated: true, completion: nil)
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
- return self.deals.count
- }
- func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
- // try to reuse cell
- let cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("DealCell") as UITableViewCell
- // get the deal image
- let currentImage = deals[indexPath.row].imageID
- let unwrappedImage = currentImage
- var image = self.imageCache[unwrappedImage]
- let imageUrl = NSURL(string: "http://staging.api.cheapeat.com.au/deals/\(unwrappedImage)/photo")
- //let imageData = NSData(contentsOfURL: imageUrl!)
- // access the elements using tag
- var dealImage:UIImageView = cell.viewWithTag(1) as UIImageView
- var title:UILabel = cell.viewWithTag(2) as UILabel
- var price:UILabel = cell.viewWithTag(3) as UILabel
- var location:UILabel = cell.viewWithTag(4) as UILabel
- var days:UILabel = cell.viewWithTag(5) as UILabel
- var time:UILabel = cell.viewWithTag(6) as UILabel
- var venue:UIButton = cell.viewWithTag(7) as UIButton
- // reset reused cell image to placeholder
- dealImage.image = UIImage(named: "placeholder")
- // async image
- if image == nil {
- let request: NSURLRequest = NSURLRequest(URL: imageUrl!)
- NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
- if error == nil {
- image = UIImage(data: data)
- self.imageCache[unwrappedImage] = image
- dispatch_async(dispatch_get_main_queue(), {
- dealImage.image = image
- })
- }
- else {
- }
- })
- }
- else{
- dealImage.image = image
- }
- // set the cell properties
- let currentDealToDisplay:Deal = self.deals[indexPath.row]
- //dealImage.image = UIImage(data: imageData!)
- title.text = " " + currentDealToDisplay.title + " "
- price.text = "$" + currentDealToDisplay.price.stringByTrimmingCharactersInSet(NSCharacterSet.punctuationCharacterSet())
- /*
- var cleanedUpDays = currentDealToDisplay.days.stringByReplacingOccurrencesOfString("\"", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
- days.text = cleanedUpDays.stringByTrimmingCharactersInSet(NSCharacterSet.punctuationCharacterSet())
- var cleanedUpTime = currentDealToDisplay.time.stringByReplacingOccurrencesOfString("\"", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
- time.text = cleanedUpTime.stringByTrimmingCharactersInSet(NSCharacterSet.punctuationCharacterSet())
- */
- location.text = currentDealToDisplay.location
- venue.setTitle("\(currentDealToDisplay.location)", forState: UIControlState.Normal)
- venue.tag = indexPath.row
- // remove table view insets
- cell.layoutMargins = UIEdgeInsetsZero
- return cell
- }
- func getDeals() -> [Deal] {
- // Array of deal objects
- var deals:[Deal] = [Deal]()
- // Get Json array of dictionaries
- let jsonObjects:[NSDictionary] = self.getRemoteJsonFile()
- // Loop through each dictionary and assign values to our deal objs
- var index:Int
- self.ids = [String]()
- self.restaurantsName = [String]()
- self.restaurantsAdd = [String]()
- self.venueInfo = [String]()
- self.resLats = [String]()
- self.resLng = [String]()
- self.resPhone = [String]()
- for index = 0; index < jsonObjects.count; index++ {
- // Current JSON dict
- let jsonDictionary:NSDictionary = jsonObjects[index]
- self.restaurantDictionarys = jsonDictionary["restaurants"] as [NSDictionary]
- // Create a deal obj
- var q:Deal = Deal()
- // Assign the values of each key value pair to the deal object
- q.title = jsonDictionary["name"] as String
- q.price = jsonDictionary["price_data"] as String
- q.imageID = jsonDictionary["id"] as String
- q.location = restaurantDictionarys[0]["name"] as String
- q.latitude = restaurantDictionarys[0]["lat"] as String
- q.longitude = restaurantDictionarys[0]["lng"] as String
- q.days = jsonDictionary["availability_day"] as String
- q.time = jsonDictionary["availability_time"] as String
- /*q.answers = jsonDictionary["answers"] as [String]
- q.correctAnswerIndex = jsonDictionary["correctIndex"] as Int
- q.module = jsonDictionary["module"] as Int
- q.lesson = jsonDictionary["lesson"] as Int
- q.feedback = jsonDictionary["feedback"] as String*/
- for values in restaurantDictionarys{
- var id : String = restaurantDictionarys[self.i]["id"] as String
- var name : String = restaurantDictionarys[self.i]["name"] as String
- var address : String = restaurantDictionarys[self.i]["friendly_address"] as String
- if let venue = restaurantDictionarys[self.i]["description"] as? String{
- self.venueInfo.append(venue)
- }else{
- self.venueInfo.append("No Description")
- }
- if let phone = restaurantDictionarys[self.i]["phone"] as? String{
- self.resPhone.append(phone)
- }else{
- self.resPhone.append("Not Available")
- }
- var lat : String = restaurantDictionarys[self.i]["lat"] as String
- var lng : String = restaurantDictionarys[self.i]["lng"] as String
- self.ids.append(id)
- self.restaurantsName.append(name)
- self.restaurantsAdd.append(address)
- self.resLats.append(lat)
- self.resLng.append(lng)
- }
- // Add the question to the question array
- deals.append(q)
- }
- // Return list of question objects
- return deals
- }
- func getRemoteJsonFile() -> [NSDictionary] {
- // Create a new URL
- let remoteUrl:NSURL? = NSURL(string: "http://staging.api.cheapeat.com.au/search?lat=\(self.lat)&lng=\(self.lng)")
- let urlString:String = "\(remoteUrl)"
- println(urlString)
- // Check if it's nil
- if let actualRemoteUrl = remoteUrl {
- // Try to get the data
- let fileData:NSData? = NSData(contentsOfURL: actualRemoteUrl)
- // Check if it's nil
- if let actualFileData = fileData {
- // Parse out the dictionaries
- let arrayOfDictionaries:[NSDictionary]? = NSJSONSerialization.JSONObjectWithData(actualFileData, options: NSJSONReadingOptions.MutableContainers, error: nil) as [NSDictionary]?
- if let actualArrayOfDictionaries = arrayOfDictionaries {
- // Successfully parsed out array of dictionaries
- return actualArrayOfDictionaries
- }
- }
- }
- return [NSDictionary]()
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment