Ios JSON下载Swift 4后从分区表视图获取正确的索引行

Ios JSON下载Swift 4后从分区表视图获取正确的索引行,ios,swift,Ios,Swift,JSON数据在下载之前已按字母顺序排列。应用程序将数据正确地划分为多个部分,根据第一个字母创建部分标题,并在正确的部分中列出以该字母开头的所有名称。问题在于,每个剖面在转换到详图视图控制器后都会重复相同的数据。B、C等部分显示所有正确的名称,但在转到详图视图控制器时重复“A”名称。如何使所选单元格和详细信息视图控制器再次匹配 func numberOfSections(in tableView: UITableView) -> Int { return figuresByLette

JSON数据在下载之前已按字母顺序排列。应用程序将数据正确地划分为多个部分,根据第一个字母创建部分标题,并在正确的部分中列出以该字母开头的所有名称。问题在于,每个剖面在转换到详图视图控制器后都会重复相同的数据。B、C等部分显示所有正确的名称,但在转到详图视图控制器时重复“A”名称。如何使所选单元格和详细信息视图控制器再次匹配

func numberOfSections(in tableView: UITableView) -> Int {
    return figuresByLetter.count
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return figuresByLetter[section].key
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return figuresByLetter[section].value.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "figureCell", for: indexPath)
    cell.textLabel?.text = figuresByLetter[indexPath.section].value[indexPath.row].name
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "showDetails", sender: self)
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? FigureViewController {
        destination.figure = figures[(tableView.indexPathForSelectedRow?.row)!]
    }
}
让我知道是否有任何其他代码需要回答这个问题

struct FigureStats: Decodable {
let name: String
let number: String
let weapon: String?
let desc: String?
let year: String?
}
在详细视图控制器中:

class FigureViewController: UIViewController {
var figure:FigureStats?

override func viewDidLoad() {
    super.viewDidLoad()

    nameLabel.text = figure?.name
    numberLabel.text = figure?.number
    weaponLabel.text = figure?.weapon
    descLabel.text = figure?.desc
    yearLabel.text = figure?.year
    }
}

我认为您的问题在于您没有将数据发送到showDetails(我不知道您是如何做到的),因此您可以看到添加到情节提要中的数据,而不是来自模型的数据,请检查它

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "showDetails", sender: indexPath)
} 

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetails" {
        let controller = (segue.destination as! UINavigationController).topViewController as! YourViewController
        let row = (sender as! IndexPath).row

        controller.figuresByLetter = figuresByLetter[row]
    }
}

尝试使用此属性。我希望它能帮助你

class YourClass: UIViewController {

var currentFigure: FigureStats!

func numberOfSections(in tableView: UITableView) -> Int {
    return figuresByLetter.count
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return figuresByLetter[section].key
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return figuresByLetter[section].value.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "figureCell", for: indexPath)
    cell.textLabel?.text = figuresByLetter[indexPath.section].value[indexPath.row].name
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
currentFigure = figuresByLetter[indexPath.section].value[indexPath.row]
print(currentFigure)
    performSegue(withIdentifier: "showDetails", sender: self)
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? FigureViewController {
        print(currentFigure)
        destination.figure = currentFigure
    }
}

class FigureViewController: UIViewController {
var figure:FigureStats?

override func viewDidLoad() {
    super.viewDidLoad()

    print(figure)
    nameLabel.text = figure?.name
    numberLabel.text = figure?.number
    weaponLabel.text = figure?.weapon
    descLabel.text = figure?.desc
    yearLabel.text = figure?.year
    }
}

@MedicineMan您应该将viewcontroller更改为viewcontroller,并为detail controller(例如FiguresByLitter)创建属性,从属性中获取数据并插入插座。如果你有什么问题,尽管问我,我很乐意帮忙。如果没有问题,请关闭此问题。详图视图控制器从结构获取其所有输入。var图形:图形集?FigureStats是包含名称和描述的结构。@MedicineMan你能发送屏幕吗,因为我不懂(我对英语知之甚少)@MedicineMan你能做一个断点来测试对象中包含的值吗?如果你不能,那没什么大不了的。我们可以在3个位置使用打印:1。在“cell.textlab?.text=figuresByLetter[indexPath.section].value[indexPath.row].name”之后。2.在“destination.figure=figures[(tableView.indexPathForSelectedRow?.row)!]”3之前。在“namelab.text=figure?.name”之前,你能告诉我你看到了哪些数据吗。在“cell.textlab?.text=figuresByLetter[indexPath.section].value[indexPath.row].name”之后,显示所有正确的名称。错误:“无法在没有参数的情况下调用类型“FigureStats”的初始值设定项”您是否更改了FigureStats结构?@MedicineMan尝试将“var currentFigure=FigureStats”更改为“var currentFigurestats:FigureStats”错误:“类“ViewController”没有initializers@MedicineMan尝试将“var currentFigure:FigureStats”更改为“var currentFigure:FigureStats!”我自己已经尝试过了。详图视图控制器现在显示错误的数据。它总是同样错误的数据。