TableView数组映射

时间:2017-01-28 03:47:35

标签: ios swift uitableview

我的代码是swift 3并且在TableView中创建了两个数组,将JSON数据转换为Array,如果我映射这两个数组将得到错误索引超出范围,如何正确地图Array

func trainType() {
    do {
        /// 取得所有列車車種資料
        let trainTypeUrl = URL(string: "http://ptx.transportdata.tw/MOTC/v2/Rail/TRA/TrainClassification?$format=JSON")

        let trainTypeData = try? Data(contentsOf: trainTypeUrl!)
        let trainTypeJson = try? JSONSerialization.jsonObject(with: trainTypeData!, options: .mutableContainers)

        if let trainTypes = trainTypeJson as? [[String : AnyObject]] {
            for dataTrainType in trainTypes {


                trainTypeArray.append(dataTrainType as AnyObject)
            }
        }
    }
    self.tableView.reloadData()
}

func trainInOutstatusData() {
    do {

        let trainStatusUrl = URL(string: "http://ptx.transportdata.tw/MOTC/v2/Rail/TRA/LiveBoard?$format=JSON")

        let trainInOutstatusData = try? Data(contentsOf: trainStatusUrl!)
        let trainInOutStatusjson = try? JSONSerialization.jsonObject(with: trainInOutstatusData!, options: .mutableContainers)
        if let InOutStatus = trainInOutStatusjson as? [[String : AnyObject]] {
            for dataInOutStatus in InOutStatus {

                trainStatusArray.append(dataInOutStatus as AnyObject!)

            }
        }

    }
    self.tableView.reloadData()
}

地图数组

let stationClassID = trainStatusArray[indexPath.row]["TrainClassificationID"] as? String
    let trainClassID = trainTypeArray[indexPath.row]["TrainClassificationID"] as? String
    if stationClassID == trainClassID {
        if let trainTypeID = trainTypeArray[indexPath.row]["TrainClassificationID"] as? [String : Any] {
            let ZHtw = trainTypeID["Zh_tw"] as? String
            cell.stationTrainClassID.text = ZHtw

        }
    }

1 个答案:

答案 0 :(得分:0)

由于您在两个阵列中都有不同的数据计数,因此您无法按照您的尝试进行操作。因为您认为trainStatusArray 5计数 3计数,所以当前indexPath.row为4 。然后

let stationClassID = trainStatusArray[4]["TrainClassificationID"] as? String // You will get some value here.
let trainClassID = trainTypeArray[4]["TrainClassificationID"] as? String // Here app will crash because, total count is 3 in but you are trying to access element at index 4.

<强>解决方案:

您可以将具有较高计数的数组作为tableView的数据源,然后您可以使用for loop中的cellForRowAtIndexpath来检查值是否匹配。

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

    let stationClassID = trainStatusArray[indexPath.row]["TrainClassificationID"] as? String
    for trainType in trainTypeArray {
        let trainClassID = trainType["TrainClassificationID"] as? String
        if stationClassID == trainClassID {
            if let trainTypeID = trainTypeArray[indexPath.row]["TrainClassificationID"] as? [String : Any] {
                let ZHtw = trainTypeID["Zh_tw"] as? String
                cell.stationTrainClassID.text = ZHtw
            }
        }
    }

}

感谢。