I am making a shopping app but I've come to a problem.
So far I've been json parsing, making a the tableview cell but I've come to an error where it says out of range:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "hello", for: indexPath) as! DisplayShopTableCellTableViewCell
// Configure the cell...
cell.userLbl.text = namee[indexPath.row] //Index out of range
cell.passLbl.text = myprice[indexPath.row]
let imagedata = try! Data(contentsOf: mySecond[indexPath.row].imageUrl!)
cell.tablecellimageview.image = UIImage(data: imagedata)
return cell
}
This is my display shop table cell:
class DisplayShopTableCellTableViewCell: UITableViewCell {
#IBOutlet weak var userLbl: UILabel!
#IBOutlet weak var passLbl: UILabel!
#IBOutlet weak var tablecellimageview: UIImageView!
Parsing
func extracted(){
guard let url = URL(string: "http://rajeshrmohan.com/sport.json")
else {
return
}
let task = URLSession.shared.dataTask(with: url){
(data,response,error) in
guard let dataResponse = data,
error == nil else {
print(error?.localizedDescription ?? "Response Error")
return
}
do {
let decoder = JSONDecoder()
let model = try decoder.decode(FullClothes.self, from: dataResponse)
//print(model)
for i in 0..<model.item.count{
self.namee.append(model.item[i].name!)
self.myprice.append(String(model.item[i].price!))
self.myphoto.append(model.item[i].image!)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
catch let parsingError {
print("Error", parsingError)
}
}
task.resume()
}
I think the parsing is done in a wrong way, additionally, as El Tomato commented, why using multiple arrays for constructing a cell, one more comment, configuring cell shouldn't be done inside cellForRowAt, it would be better done within cell itself.
Check the following code snippet and let me know if you need any help withh it.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "hello", for: indexPath) as! DisplayShopTableCellTableViewCell
// Configure the cell...
cell.bind(self.myData[indexPath.row])
return cell
}
class DisplayShopTableCellTableViewCell: UITableViewCell {
#IBOutlet weak var userLbl: UILabel!
#IBOutlet weak var passLbl: UILabel!
#IBOutlet weak var tablecellimageview: UIImageView!
func bind(_ cellData: Item) {
self.userLbl.text = cellData.name
self.passLbl.text = String(cellData.price)
guard let imageURL = URL(string: "\(cellData.image)") else {
preconditionFailure("Invalid static URL string: \(cellData.image)")
}
guard let imagedata = try? Data(contentsOf: imageURL) else {
return
}
self.tablecellimageview.image = UIImage(data: imagedata)
}
}
struct Item: Decodable {
let name: String
let price: Float
let image: String
}
func extracted() {
guard let url = URL(string: "http://rajeshrmohan.com/sport.json")
else {
return
}
let task = URLSession.shared.dataTask(with: url){
(data,response,error) in
guard let dataResponse = data,
error == nil else {
print(error?.localizedDescription ?? "Response Error")
return
}
do {
let decoder = JSONDecoder()
let items: [Item] = try decoder.decode([Item].self, from: dataResponse)
//print(model)
for i in 0..<items.count {
self.myData.append(items[i])
}
}
catch let parsingError {
print("Error", parsingError)
}
}
task.resume()
}
Finally, try as far as you can to avoid force casting, check this question for further insights about force casting.
Optional chaining would be helpful too.
Related
I am fetching json data from API and filling a UITableview from it - up to here everything is working fine.
The issue is saving the data into core data. As far as I know - I am saving the data correctly, and I have debugged to see that actually 15 objects have been saved into the core data. my issue is when trying to retrieve the data back from core data - I am getting only one object from the entire json list, usually it is the first one but sometimes it is some other index.
here is my VC:
import UIKit
import CoreData
import Kingfisher
class MoviesViewController: UITableViewController {
let base_url = "https://api.androidhive.info/json/movies.json"
let context = PersistanceService.context
var moviesArray = [Movie]()
override func viewDidLoad() {
super.viewDidLoad()
if loadData(){
print("loading items from local presistancy")
} else {
print("fetching new data from api")
dataFetchFromMoviesApi()
}
//dataFetchFromMoviesApi()
tableView.estimatedRowHeight = 180
tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "MovieCell")
}
//MARK: - TableView Delegate Method
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
performSegue(withIdentifier: "showMovieDetails", sender: moviesArray[indexPath.row])
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
//MARK: - TableView Datasource Methods
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let movie = moviesArray[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! TableViewCell
cell.title.text = "Title: \(movie.title)"
cell.rating.text = "Rating: \(String(movie.rating))"
cell.releaseYear.text = "Release Year: \(String(movie.releaseYear))"
cell.genre.text = "Genre: \(String(movie.genre[0]))"
cell.movieImage.downloaded(from: movie.image)
return cell
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return moviesArray.count
}
//MARK: - Segue Method
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showMovieDetails" {
let movieVC = segue.destination as! MovieDetailsViewController
movieVC.selectedMovie = sender as? Movie
}
}
//MARK: - Data Fetching Method
func dataFetchFromMoviesApi(){
httpRequest(urlForRequest: base_url) { [weak self] (data: Data?, error: Error?) in
if error == nil { //no error - continue
if let moviesData = data { //un-wrapping the data object
let decoder = JSONDecoder()
do {
let responseArray = try decoder.decode([Movie].self, from: moviesData)
//print(responseArray)
DispatchQueue.main.async {
self?.moviesArray = responseArray
self?.moviesArray.sort(by: {$0.releaseYear > $1.releaseYear})
for movie in self!.moviesArray {
let movieModel = MovieModel(context: self!.context)
movieModel.title = movie.title
movieModel.releaseYear = String(movie.releaseYear)
movieModel.rating = String(movie.rating)
movieModel.genre = movie.genre[0]
movieModel.image = movie.image
}
PersistanceService.saveContext()
self?.tableView.reloadData()
}
} catch {
print(error)
}
}
} else {
//error fetching data
print(error?.localizedDescription ?? "error with no description")
}
}
}
//MARK: - Http Request
private func httpRequest(urlForRequest: String, completion: #escaping (Data?, Error?) -> Void){
guard let url = URL(string: urlForRequest) else {return}
let task = URLSession.shared.dataTask(with: url) { (data: Data?, urlResponse: URLResponse?, error: Error?) in
if error == nil {
//task was succfull
completion(data, nil)
} else {
//task was unsuccessfull
completion(nil, error)
}
}
task.resume()
}
func saveData(){
do {
try context.save()
} catch {
print("error saving context, \(error.localizedDescription)")
}
}
func loadData() ->Bool{
let fetchRequest: NSFetchRequest<MovieModel> = MovieModel.fetchRequest()
do {
let movies = try PersistanceService.context.fetch(fetchRequest)
print(movies.count)
for movie in movies {
let title = movie.title!
let rating = Float(movie.rating!)!
let image = movie.image!
let genre = [movie.genre!]
let releaseYear = Int(movie.releaseYear!)!
let newMovie = Movie(title: title, image: image, rating: rating, releaseYear: releaseYear, genre: genre)
self.moviesArray.append(newMovie)
print("movies array count: \(moviesArray.count)")
print("successfully loaded items")
return true
}
} catch {
print("error fetching from core data, \(error)")
return false
}
return false
}
}
I am working with 2 parallel data type - one is a movie entity for core data, the other is a movie struct that conforms to the codeable protocol in other to decode json. so when getting back the fetch request I assign it into the movies object, and to my understanding that makes the movies object as an array of my movies entity. Am I right?
Hopefully someone could point me of the mistake I am doing.
You have placed your return in the wrong place in loadData, move it out of the for loop
for movie in movies {
let title = movie.title!
let rating = Float(movie.rating!)!
let image = movie.image!
let genre = [movie.genre!]
let releaseYear = Int(movie.releaseYear!)!
let newMovie = Movie(title: title, image: image, rating: rating, releaseYear: releaseYear, genre: genre)
self.moviesArray.append(newMovie)
print("movies array count: \(moviesArray.count)")
print("successfully loaded items")
// return true <-- This was wrong
}
return true //move it here
I want to show data in UICollectionView. Which is coming from UITableView cell. My main concern is this. I am passing a key catgID from cellForRowAt in another API and getting data from it. But data is not coming proper way.
I am passing catgID from cellForRowAt and getting in another API which will show the list of data for UICollectionViewCells. Now data is coming but not in proper way.
This is my UITableView class for tableview index.
import UIKit
import Reachability
import Alamofire
var arrayMenuProducts = [structMenuProducts]()
struct structMenuProducts {
var id:Int
var product_name:String
var category:String
var product_image:String
var price:String
var unit_price:Double
var addons:NSArray
}
class MenuVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
var reachability = Reachability()!
#IBOutlet weak var tableview: UITableView!
var arrayMenuCat = [structMenuCat]()
struct structMenuCat{
var id:Int
var category_name:String
}
override func viewDidLoad() {
super.viewDidLoad()
menuVegAPI()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return arrayMenuCat.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
catgID = arrayMenuCat[indexPath.row].id
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1") as! MenuTableCell
cell.lblCategoryTitle.text = arrayMenuCat[indexPath.row].category_name
cell.collectionviewOne.reloadData()
// let catid = arrayMenuCat[indexPath.row].id
// print(catid)
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 216
}
func menuVegAPI()
{
if (reachability.connection == .wifi) || (reachability.connection == .cellular)
{
arrayMenuCat.removeAll()
SwiftLoader.show(animated: true)
let url = BaseUrl + ViewController.sharedInstance.menuCategory
print(url)
Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default).responseJSON { response in
SwiftLoader.hide()
switch response.result {
case .success:
let json = response.result.value
print(json)
let code = (json as AnyObject).object(forKey: "code") as! Int
print(code)
if code == 200
{
let data = (json as AnyObject).object(forKey: "data") as? NSArray
for alldata in data!
{
let id = (alldata as AnyObject).object(forKey: "id") as! Int
let category_name = (alldata as AnyObject).object(forKey: "category_name") as! String
let arr = structMenuCat(id: id, category_name: category_name)
self.arrayMenuCat.append(arr)
// self.menuProductsAPI(categoryid: id)
}
self.tableview.reloadData()
}
else
{
}
case .failure:
print("error")
}
}
}
else
{
alert(title: "", message: "Please Check Your Internet Connection")
}
}
}
This is my TableViewCell type class. In this class I am show data on CollectionView. Its code is here
import UIKit
import Alamofire
import Reachability
var catgID : Int!
var collectionreload : UICollectionView?
class MenuTableCell: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegate {
var reachability = Reachability()!
#IBOutlet weak var lblCategoryTitle: UILabel!
#IBOutlet weak var collectionviewOne: UICollectionView!
var arrayMenuProducts = [structMenuProducts]()
struct structMenuProducts {
var id:Int
var product_name:String
var category:String
var product_image:String
var price:String
var unit_price:Double
var addons:NSArray
}
override func awakeFromNib() {
super.awakeFromNib()
collectionreload = self.collectionviewOne
print(arrayMenuProducts)
print(catgID ?? 0)
menuProductsAPI(categoryid: catgID!)
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return arrayMenuProducts.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CellRID", for: indexPath) as! MenuCollectionViewCell
let abc = arrayMenuProducts[indexPath.row].product_name
print(abc)
// if catgID == Int(arrayMenuProducts[indexPath.row].category)
// {
cell.lblTitleForVeg.text = arrayMenuProducts[indexPath.row].product_name
cell.lblForPriceVeg.text = "$\(arrayMenuProducts[indexPath.row].unit_price)"
}
func menuProductsAPI(categoryid:Int)
{
if (reachability.connection == .wifi) || (reachability.connection == .cellular)
{
SwiftLoader.show(animated: true)
arrayMenuProducts.removeAll()
let url = BaseUrl + ViewController.sharedInstance.menuProducts + "categoryid=\(categoryid)"
print(url)
Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default).responseJSON { response in
switch response.result {
case .success:
let json = response.result.value
print(json)
// self.tableview.reloadData()
let code = (json as AnyObject).object(forKey: "code") as! Int
print(code)
if code == 200
{
let data = (json as AnyObject).object(forKey: "data") as? NSArray
DispatchQueue.main.async {
for alldata in data!
{
let id = (alldata as AnyObject).object(forKey: "id") as! Int
let product_name = (alldata as AnyObject).object(forKey: "product_name") as! String
let category = (alldata as AnyObject).object(forKey: "category") as! String
let product_image = (alldata as AnyObject).object(forKey: "product_image") as! String
let price = (alldata as AnyObject).object(forKey: "price") as! String
let unit_price = (alldata as AnyObject).object(forKey: "unit_price") as! Double
let addons = (alldata as AnyObject).object(forKey: "addons") as? NSArray
let arr = structMenuProducts(id: id, product_name: product_name, category: category, product_image: product_image, price: price, unit_price: unit_price, addons: addons!)
self.arrayMenuProducts.append(arr)
}
self.collectionviewOne.reloadData()
SwiftLoader.hide()
}
}
else
{
}
case .failure:
print("error")
}
}
}
else
{
// alert(title: "", message: "Please Check Your Internet Connection")
}
}
}
I want to show data coming in CollectionView in a proper formate. If Tableview index == 0 and Category id is coming 10 then. Category id 10 will first then one by one in a sequence I want to pass category id. In my case Category id is not coming in a queue.
Update the tableview datasource method as
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1") as! MenuTableCell
cell.lblCategoryTitle.text = arrayMenuCat[indexPath.row].category_name
cell.menuProductsAPI(categoryid: arrayMenuCat[indexPath.row].id)
return cell
}
And remove menuProductsAPI(categoryid: catgID!) from awakeFromNib method
Is it possible to get the data from the external database when a UItableViewCell is pressed?
I managed to create a UItableView where I am displaying the data from the database. If I press a cell then all the data that are linked to it should be displayed. For eg. if I have 4 main categories in the database such as TOOLS, OTHERS, SECURITY, PETS and each of them has its sub-catecory and are linked with each other in the database. So if I click on Pets, it should filter out and only Show me CATS, DOGS, COWS, LIONS. When I run this SQL I am able to get the information but cant figure it this out on Swift.
UItableViewCell is in my FirstviewController and its the Main Category .
When I click here it goes to my destination VC and has the table again in here.enter image description here
DestViewController is the sub-category
enter image description here
My CategoryList_ViewController.swift
import Foundation
import UIKit
import WebKit
class CategoryList_ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
#IBOutlet weak var tableView: UITableView!
#IBAction func refresh(sender: AnyObject) {
get()
}
var values:NSArray = []
override func viewDidLoad() {
super.viewDidLoad()
get();
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func get(){
let url = NSURL(string: "c:\deskstop\mobiletec\assignment\assignment2\cat.php")
let data = NSData(contentsOfURL: url!)
values = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray
tableView.reloadData()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return values.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CategoryList_TableViewCell
let maindata = values[indexPath.row]
cell.categoryLabel.text = maindata["NAME"] as? String
return cell;
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "catView" {
if let indexPath = self.tableView.indexPathForSelectedRow {
let value = values[indexPath.row]
let controller = segue.destinationViewController as! SubCatergory_ViewController
controller.cate_Id = value["id"] as! String
controller.catTitleRec = value["NAME"] as! String
}
}
}
}
my SubCatergory_ViewController.swift
import Foundation
import UIKit
import WebKit
class SubCatergory_ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
#IBOutlet weak var tableView: UITableView!
#IBOutlet weak var caID: UILabel!
#IBOutlet weak var catTitle_Label: UILabel!
#IBAction func refresh(sender: AnyObject) {
get()
}
var values:NSArray = []
var catTitleRec = ""
var cate_Id = ""
override func viewDidLoad() {
super.viewDidLoad()
catTitle_Label.text = catTitleRec
caID.text = cate_Id
get();
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func get(){
let request = NSMutableURLRequest(URL: NSURL(string: "c:\deskstop\mobiletec\assignment\assignment2\subcat.php")!)
request.HTTPMethod = "GET"
let postString = "a=\(cate_Id)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
print("response = \(response)")
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
}
task.resume()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return values.count;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! subCateListTableViewCell
let maindata = values[indexPath.row]
cell.categoryLabel.text = maindata["NAME"] as? String
return cell;
}
}
and my subcat.php
<?php
$connection = mysql_connect(........);
$catefilter = $_GET['a'];
if(!$connection){
die('Connection Failed');
}
else{
$dbconnect = #mysql_select_db($database_UNIASSIGNMENT, $connection);
if(!$dbconnect){
die('Could not connect to Database');
}
else{
$query = 'SELECT category_group.group_id , category.NAME FROM category_group LEFT JOIN category ON category.id = category_group.category_id WHERE category_group.group_id =' . $catefilter ;
$resultset = mysql_query($query, $connection);
$records= array();
while($r = mysql_fetch_assoc($resultset)){
$records[] = $r;
}
echo json_encode($records);
}
}
?>
My first VC works fine but my second VC doesnot get the data
Thanks for your time :)
SK
To access the cell that has been pressed, you need to call the didSelectRowAtIndexPath function.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let value = values[indexPath.row]
let vc = storyboard?.instantiateViewController(withIdentifier: "SubCatergory_ViewController") as! SubCatergory_ViewController
vc.cate_Id = value["NAME"] as! String
//self.navigationController?.pushViewController(vc, animated: true)
self.present(vc, animated: true, completion: nil)
}
First you get the value out of your values Array on the indexPark.row. Then you instantiate your second viewController.
Then you set your String value of cate_Id to the desired String value of your item value. And then you just need to present the new viewController.
If you're using a UINavigationController and you want a "back" button, then you use: self.navigationController?.pushViewController(vc, animated: true)
If you just want to present the viewController, you use self.present(vc, animated: true, completion: nil)
Comment or uncomment whatever presentation method you prefer.
It appears my loop seems to load all the images taken from a feed into the image view but sets only the very last image from the feed into all cells I'm not sure how to stop this and grab a image for each cell and set it. I'm new to swift and I've sorta jumped right in to programming.. heres the code of interest any help is appreciated
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! BlogPost
let blogPost: BlogPost = blogPosts[indexPath.row]
cell.textLabel?.text = blogPost.postTitle
// cell.textLabel?.text = blogPost.postImageLink
// if cell.postImage?.image == nil {
// let cache = ImageLoadingWithCache()
// cache.getImage(cell.postImageLink, imageView: cell.postImage, defaultImage: "IMG_0079")
if cell.postImage?.image == nil {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
// retrieve image from url
let image = UIImage(data: NSData(contentsOfURL: NSURL(string:self.postImageLink)!)!)
self.imageArray.append(image!)
dispatch_async(dispatch_get_main_queue(), { Void in
// set image in main thread
guard indexPath.row < self.imageArray.count else { return }
cell.postImage?.image = self.imageArray[indexPath.row]
})
}
}
blog class
class BlogPost: UITableViewCell {
#IBOutlet weak var postImage: UIImageView!
var postTitle: String = String()
var postLink: String = String()
var postImageLink: String = String()
#IBOutlet weak var postLabel: NSLayoutConstraint!
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
I'm able to successfully populate the array with my JSON data inside of the loop, and I'm trying to populate the cells of my TableView with the same information, but currently the list comes up with no content.
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
#IBOutlet weak var table: UITableView!
var headlines = [String]()
let baseURL = "http://api.nytimes.com/svc/topstories/v1/business.json?api-key=123456789"
override func viewDidLoad() {
getJSON()
super.viewDidLoad()
self.table.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
self.table.dataSource = self
self.table.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func getJSON() {
let url = NSURL(string: baseURL)
let request = NSURLRequest(URL: url!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let task = session.dataTaskWithRequest(request){ (data, response, error) -> Void in
if error == nil {
let SwiftyJSON = JSON(data: data!)
let theTitle = SwiftyJSON["results"].arrayValue
for title in theTitle{
let titles = title["title"].stringValue
self.headlines.insert(titles, atIndex: 0)
//print("- " + titles)
}
print(self.headlines)
}
else {
print("there was an error")
}
}
task.resume()
}
// From the UITAbleViewDataSource
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return headlines.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.table.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell
cell.textLabel!.text = self.headlines[indexPath.row]
return cell
}
// From the UITableViewDelegate
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("You tapped on cell # \(indexPath.row)")
}
}
The task is asynchronous, so when you've loaded the array you have to reload your table
func getJSON() {
let url = NSURL(string: baseURL)
let request = NSURLRequest(URL: url!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
let task = session.dataTaskWithRequest(request){ (data, response, error) -> Void in
if error == nil {
let SwiftyJSON = JSON(data: data!)
let theTitle = SwiftyJSON["results"].arrayValue
for title in theTitle{
let titles = title["title"].stringValue
self.headlines.insert(titles, atIndex: 0)
//print("- " + titles)
}
print(self.headlines)
self.table.reloadData()
}
else {
print("there was an error")
}
}
task.resume()
}