RDowns RDowns - 6 days ago 8
Swift Question

How do I add extra columns to this UITableView and populate with data already fetched?

In the following code I fetch some data for a UITableView.

Currently, the table shows one column of data 'homeTeam'.

My desired output is to have multiple columns within the UITableView.

I have fetched the arrays for the other columns which can be seen in the code below.

import UIKit

class ShowResultsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


var personalPlayerId: String?
var communityId: String?
var personalPlayer2Id: String?
var postString: String?

var homeTeam = [String?]()
var homePlayer = [String?]()
var homeGoals = [String?]()

var awayTeam = [String?]()
var awayPlayer = [String?]()
var awayGoals = [String?]()

var matchId = [String?]()

var tempResult: Int?

var selectedMatch: String?

var headToHead: Bool?

@IBOutlet weak var leagueTableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()



self.leagueTableView.delegate = self
self.leagueTableView.dataSource = self


}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return self.homeTeam.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let title = self.homeTeam[indexPath.row]
let cell = UITableViewCell()

return cell

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

tempResult = indexPath.row

if let tempShowResult = (self.homeTeam[tempResult!]){
self.selectedMatch = tempShowResult
}

}

override func viewDidAppear(_ animated: Bool) {
let myUrl = URL(string: "http://www.???.uk/???/getLeagueResults.php")
var request = URLRequest(url:myUrl!)
request.httpMethod = "POST"

if self.headToHead == true {
self.postString = "player_id=\(self.personalPlayerId!)&player2_id=\(personalPlayer2Id!)&community_id=\(communityId!)";
}else{
if self.headToHead == false{
self.postString = "player_id=\(self.personalPlayerId!)&community_id=\(communityId!)";
}
}

request.httpBody = self.postString?.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
DispatchQueue.main.async
{
do{

let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject]
print (json!)


// GET DATA FOR TABLE COLUMNS


if let arr = json?["allPersonalLeagueStats"] as? [[String:String]] {
self.homeTeam = arr.flatMap { $0["player1_team"]!}
self.homePlayer = arr.flatMap { $0["player1_name"]!}
self.homeGoals = arr.flatMap { $0["player1_goals"]!}

self.awayTeam = arr.flatMap { $0["player2_team"]!}
self.awayPlayer = arr.flatMap { $0["player2_name"]!}
self.awayGoals = arr.flatMap { $0["player2_goals"]!}

self.matchId = arr.flatMap { $0["results_id"]!}
}


self.leagueTableView.reloadData()
}


catch{
print(error)
}
}
}
task.resume()


}


}


How do I add more columns to this table to show the extra columns;
home_player
,
home_goal
,
away_player
,
away_team
,
away_goals
?

I would like the output to represent the following in a table:

+---------------+---------+-------+-------+------------+--------------+
| Bobby Charles | Man Utd | 2 | 3 | Fiorentina| Andrew James |
| Ryan Stood | Arsenal | 0 | 1 | Chelsea | Bobby Charles|
| Bobby Charles | Chelsea | 0 | 2 | Liverpool | Ryan Stood |
+---------------+---------+-------+-------+------------+--------------+

Answer
  1. take a UITableViewCell
  2. Add six UILabels to this cell
  3. As you having different arrays for each, in cellForRowAtindexPath add data to these labels.

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:    NSIndexPath) -> UITableViewCell {
    
            let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyTableViewCell
    
            cell.label1.text = self.homeTeam[indexPath.row]
            cell.label2.text = self.homePlayer[indexPath.row]
            cell.label3.text = self.homeGoal[indexPath.row]
            cell.label4.text = self.awayTeam[indexPath.row]
            cell.label5.text = self.awayPlayer[indexPath.row]
            cell.label6.text = self.awayGoals[indexPath.row]
    
            return cell
    }
    

Note: Maintaining that many arrays is not a good idea.

Use Struct instead, to handle the data.it is easier and simpler

Comments