Swift 3:分段控制到TableView。重新加载表

时间:2017-02-15 16:24:47

标签: ios swift uitableview swift3 uisegmentedcontrol

我有一个自定义的UITableView和一个带有UISegmentedControl的自定义UITableViewCell。该单元格位于表格的第一行内。

问题是我使用valueChanged事件从json加载数据,当我重新加载tableview时,select索引会自动返回到第一个段。我该如何解决这个问题?

这是我的代码的一部分:

@IBAction func segmentChanged(_ sender: UISegmentedControl) {

    switch sender.selectedSegmentIndex{
        case 0:
            loadIdeas(idRole:[0,1], id_user: 1, estado: "todas")

        case 1:
            loadIdeas(idRole:[0,1], id_user: 1, estado: "aceptada")

        case 2:
            loadIdeas(idRole:[0,1], id_user: 1, estado: "pendiente")

        case 3:
            loadIdeas(idRole:[0,1], id_user: 1, estado: "rechazada")

        default:
            loadIdeas(idRole:[0,1], id_user: 1, estado: "todas")
    }

}

然后刷新" loadIdeas"中的数据。功能如下:

DispatchQueue.main.async{
                self.table.tableView.reloadData() // Refrescamos el contenido de la tabla
            }

每次选择其他段时数据都会正确更改,但分段控件始终会在重新加载数据之前保留第一个段。

请帮帮我。我已经浪费了我几个小时的时间,而且我还没有在网上找到任何可以帮助我的类似情况

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if(cells[indexPath.row].cell == 1){
        let cell = Bundle.main.loadNibNamed("CustomHeaderCell", owner: self, options: nil)?.first as! CustomHeaderCell
        cell.menuLabel.text = cells[indexPath.row].titulo

        return cell
    }
    else if(cells[indexPath.row].cell == 2){
        let cell = Bundle.main.loadNibNamed("SegmentedControlCell", owner: self, options: nil)?.first as! SegmentedControlCell
        cell.table = self

        return cell
    }
    else{
        let cell = Bundle.main.loadNibNamed("MyTableViewCell", owner: self, options: nil)?.first as! MyTableViewCell
        cell.labelTitulo.text = cells[indexPath.row].titulo
        cell.labelDescripcion.text = cells[indexPath.row].descripcion
        cell.labelEstado.text = cells[indexPath.row].estado
        cell.labelFecha.text = cells[indexPath.row].fecha
        cell.labelDepartamento.text = cells[indexPath.row].departamento
        //cell.imageView?.image = cells[indexPath.row].imagen

        return cell
    }
}

1 个答案:

答案 0 :(得分:2)

UITableView数据源是一个不常用的API。表格视图本身并不知道(或记住)有关您数据的任何内容,因此您必须在tableView(_:cellForRowAt:)方法中完全指定所有内容。换句话说,对于SegmentedControlCell情况,您需要有一些方法来保存当前选定的段并根据需要进行恢复。

这可能意味着在cells数组中与所选段对应的任何类上都有一些属性。这有意义吗?