Как сохранить выбранный элемент в tableviewcell - PullRequest
0 голосов
/ 17 февраля 2020

Я хочу спросить, как сохранить выбранные все элементы в tableViewCell, как показано на рисунке ниже. поэтому позже я могу опубликовать его с помощью alamofire, у меня нет опыта публикации данных раньше. вот что я сделал.

post

это моя кнопка, поэтому я могу позже публиковать сообщения с помощью alamofire, пока я хочу проверить это.

    @objc func handleSubmit() {
        var data: [String] = []
        for (index, value) in attendance.enumerated() {
            print("index attendance: \(index), value attendance: \(value.status)")
            let cell = tableView.cellForRow(at: IndexPath(item: index, section: 0)) as? GStudentAbsenceCell
        UserServices.shared.postUserAttendances(status: cell?.status ?? "")
            data.append(cell?.status ?? String(index))
        }
        print(data)
    }

// In My UITableViewCell
var status: String?

statusLbl.didSelect { (selectedText , index ,id) in
               if selectedText == "Sakit" || selectedText == "Izin" || selectedText == "Alpha" {
                self.status = selectedText
                   self.statusLbl.backgroundColor = #colorLiteral(red: 0.8666666667, green: 0.4078431373, blue: 0.2705882353, alpha: 0.2)
                   self.statusLbl.textColor = #colorLiteral(red: 0.8666666667, green: 0.4078431373, blue: 0.2705882353, alpha: 1)
               }
           }

1 Ответ

0 голосов
/ 17 февраля 2020

Вы не можете безопасно хранить свое состояние моделей данных в ячейке табличного представления, потому что при прокрутке ячейка, вероятно, будет повторно использоваться для вновь видимых строк, следовательно, она сохранит состояние для другой строки и, следовательно, потеряет «старую» state.

Вам необходимо сохранить состояние в вашей модели; если невозможно использовать существующую модель, вы можете создать временный словарь, который отображает IndexPath в state

. Вы можете сделать следующее:

  1. Расширение вашей ячейки с помощью пользовательского обработчика обратного вызова, который вызывается при изменении статуса.

  2. Когда вы настраиваете свою ячейку, вручите закрытие, которое будет иметь дело с этим статусом изменения

  3. В этом закрытии обновите модель

Некоторые псевдокоды могут вам помочь:

// in your custom cell
typealias Handler: (String) -> ()
class CustomTableViewCell : UITableViewCell {
     var selectionHandler:Handler?
     func didSelect(...) {
          selectionHandler?(lblStatus.text)
     }

}

// in your view controller
// in rowForCellatIndexPath:

func  tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell { 
     let cell = /* dequeue */ as! CustomTableViewCell

     cell.selectionHandler = { statusText in
          let row = indexPath.row
          attendance[row].status = statusText /* get the status from the cell */
     }

     return cell
}
...