2017-02-15 8 views
2

У меня есть пользовательский UITableView и пользовательский UITableViewCell с UISegmentedControl. Эта ячейка находится в первой строке таблицы.Swift 3: Сегментированный контроль в TableView. Выбранный индекс теряется при перезагрузке таблицы

Проблема заключается в том, что я использую событие 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 
    } 
} 
+0

Можете ли вы поделиться своим методом tableView (_: cellForRowAt :)? –

+0

Я новичок в iOS swift, поэтому, возможно, мой код - это катастрофа: –

+1

Извините, я обновил первый комментарий с этой частью моего кода –

ответ

2

Источник данных UITableView является необычным API, чтобы привыкнуть. В самом представлении таблицы не известно (или не помнит) что-либо о ваших данных, поэтому вам нужно полностью указать все в методе tableView(_:cellForRowAt:). Другими словами, для случая SegmentedControlCell вам необходимо каким-то образом сохранить текущий выбранный сегмент и восстановить его по мере необходимости.

Это, вероятно, означает наличие какого-либо свойства для любого класса в вашем массиве cells, который соответствует выбранному сегменту. Имеет ли это смысл?

+0

Думаю, я понимаю, что вы говорите, и это имеет смысл, но я не знаю, как это сделать из-за моей структуры классов. Мне сложно справиться с такими классами пользовательского интерфейса –

+0

Dave Я, наконец, решил вашу проблему с вашим советом. Огромное спасибо!!! :) –