【发布时间】:2019-08-05 13:13:59
【问题描述】:
我创建了一个从 JSON 文件填充的数组。当我尝试用数组的项目填充表格视图时,即使indexPath.row 正确返回,它也会重复显示最后一条记录。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return leagueStandingsModelArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellTeam", for: indexPath)
let team = self.leagueStandingsModelArray[indexPath.row]
cell.textLabel?.text = String(team.teamId)
print(team.teamName)
print(indexPath.row)
return cell
}
在我的调试窗口中,这是我得到的结果:
打印了我的数组项
1 -- Santos -- 32
2 -- Palmeiras -- 28
3 -- Flamengo -- 24
4 -- Atletico-MG -- 24
这是我从下面这两行得到的回报
print(team.teamName)
print(indexPath.row)
Atletico-MG
0
Atletico-MG
1
Atletico-MG
2
Atletico-MG
3
应该打印前四支球队,而不是第四四次。
完整代码
导入 UIKit 进口阿拉莫火 导入 SwiftyJSON
类 LeagueOverviewViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let leagueModel = LeagueIdModel()
var leagueParams = LeagueParametersModel()
var leagueStandingsModelArray = [LeagueStandingsModel]()
var urls = URLs()
@IBOutlet weak var standingsTableView: UITableView!
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return leagueStandingsModelArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellTeam", for: indexPath)
let team = self.leagueStandingsModelArray[indexPath.row]
cell.textLabel?.text = String(team.teamId)
print(leagueStandingsModelArray[0].teamName)
print(leagueStandingsModelArray[1].teamName)
print(leagueStandingsModelArray[2].teamName)
return cell
}
override func viewDidLoad() {
super.viewDidLoad()
getLeagueIdJSON(country: leagueParams.country, season: leagueParams.season)
standingsTableView.delegate = self
standingsTableView.dataSource = self
}
//GET THE JSON FILE TO RETRIEVE LEAGUE ID USING COUNTRY AND SEASON AS PARAMETERS
func getLeagueIdJSON (country: String, season: Int) {
let headers = Headers().getHeaders()
let url = urls.getLeagueUrlByCountryAndSeason(country: leagueParams.country, season: leagueParams.season)
Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseJSON {
response in
if response.result.isSuccess {
let leagueJSON = JSON(response.result.value!)
self.getLeagueId(json: leagueJSON, country: self.leagueParams.country, season: self.leagueParams.season)
self.getLeagueStandings(leagueId: self.leagueModel.leagueId)
}
}
}
//GET LEAGUE_ID FROM JSON FILE RETRIEVED
func getLeagueId(json: JSON, country: String, season: Int) {
var leagueId = 0
if country == "gb" {
for league in json["api"]["leagues"].arrayValue {
if league["name"].stringValue == "Premier League" {
leagueId = league["league_id"].intValue
}
}
}
else if country == "br" {
for league in json["api"]["leagues"].arrayValue {
if league["name"].stringValue == "Serie A" {
leagueId = league["league_id"].intValue
}
}
}
leagueModel.leagueId = leagueId
}
//GET LEAGUE STANDINGS FROM A LEAGUE ID (TOP 4)
func getLeagueStandings (leagueId: Int) {
let headers = Headers().getHeaders()
let url = urls.getLeagueStandingsUrl(leagueId: leagueId)
let leagueStandingsModel = LeagueStandingsModel()
var counter = 0
Alamofire.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: headers).responseJSON {
response in
if response.result.isSuccess {
let standingsJSON = JSON(response.result.value!)
for standings in standingsJSON["api"]["standings"][counter].arrayValue {
if counter <= 3 {
leagueStandingsModel.teamId = standings["team_id"].intValue
leagueStandingsModel.rank = standings["rank"].intValue
leagueStandingsModel.teamName = standings["teamName"].stringValue
leagueStandingsModel.points = standings["points"].intValue
leagueStandingsModel.matchesPlayed = standings["all"]["matchsPlayed"].intValue
leagueStandingsModel.win = standings["all"]["win"].intValue
leagueStandingsModel.draw = standings["all"]["draw"].intValue
leagueStandingsModel.lose = standings["all"]["lose"].intValue
leagueStandingsModel.goalsFor = standings["all"]["goalsFor"].intValue
leagueStandingsModel.goalsAgainst = standings["all"]["goalsAgainst"].intValue
self.leagueStandingsModelArray.append(leagueStandingsModel)
let standings = String(self.leagueStandingsModelArray[counter].rank) + " -- " +
self.leagueStandingsModelArray[counter].teamName + " -- " +
String(self.leagueStandingsModelArray[counter].points)
print(standings)
counter += 1
}
}
}
self.standingsTableView.reloadData()
}
}
}
【问题讨论】:
-
在 cellForRow 中打印
leagueStandingsModelArray并检查是否填写正确。 -
您正在打印
team.teamName并设置team.teamId,正如@JamesP 提到的,这似乎是不一致的数据源 -
@wootage 这不是问题所在。不管我从阵列中打印什么项目。问题是它总是打印最后一个索引。
-
对不起@JamesP 你是什么意思?
-
print(self.leagueStandingsModelArray)并告诉我们结果你能显示Team
标签: arrays swift uitableview