Как я могу обновить свой список в Eureka при смене сегмента?

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

 private func setupForm() -> Void {
        
        guard let inheritorList = getInheritorList() else {
            return
        }

        
        form +++ Section()
            
            <<< LabelRow() { row in
                row.title = "Choose between multiple inheritors"
            }
            
            <<< SegmentedRow<Int>("segments") { row in
                row.options = [1,2]
                row.displayValueFor = { idx in
                    if idx == 1 {
                        return "All"
                    } else {
                        return "None"
                    }
                }
            }
            .onChange({ row in
                if row.value! == 1 {
                    //All checkboxes should be selected
                    self.inheritorFilterMode = .filterAll
                } else {
                    //All checkboxes should be deselected
                    self.inheritorFilterMode = .filterNone
                }
            })
        
        for inheritor in inheritorList {
                    form.last! <<< CheckRow("inheritors") { listRow in
                        listRow.title = inheritor.name
                        listRow.value = nil
                    }
                    .onChange({ row in
                        if row.value! {
                            self.inheritorsArray.insert(row.tag!)
                        } else {
                            self.inheritorsArray.remove(row.tag!)
                        }
                        
                    })
        }
    }
    

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

Я попытался создать перечисление и изменить режим фильтра в зависимости от значения в onChange моего метода сегментированной строки. Затем я позже в onChange моего списка check row проверял, какой режим активен, но это не сработало.

enum InheritorFilterMode {
    case filterAll, filterNone
}
...

var inheritorFilterMode: InheritorFilterMode = .filterAll

Я также попытался получить значение сегментов, получив тег:

let segmentedRow: SegmentedRow<Int>! = self.form.rowBy(tag: "segments")

но и этот подход не сработал.

Любые предложения о том, как обновить флажки при изменении сегмента?


person Valentine    schedule 14.09.2020    source источник


Ответы (1)


Я не совсем уверен, понял ли я вопрос. Но я постараюсь на него ответить.

Сама галочка — это просто вспомогательный тип, который изменяет значение строки (проверьте repo для справки:

 accessoryType = row.value == true ? .checkmark : .none

Поэтому вместо фильтрации результатов (что не должно работать так, как вы это сделали) вы должны зациклить все строки в своей форме. Существует метод form.allRows(), который позволяет вам перебирать все строки в вашей форме, а затем вам нужно только проверить, какой сегмент - в вашем случае All или None - выбран:

Таким образом, в блоке onChange вашей SegmentedRow вы можете сделать что-то вроде:

.onChange({ segmentedRow in
   for row in self.form.allRows {
      if row is CheckRow {
        if segmentedRow.value == "All" {
           row.baseValue = true
        } else if segmentedRow.value == "None" {
            row.baseValue = false
          }
          // don't forget to call update cell - otherwise the cell won't update
          row.updateCell()
      }
   }
})

Кроме того: вместо использования типа строки на основе Interger вы можете просто использовать String:

<<< SegmentedRow<String>("yourTagHere") { (segment) in 
    segment.options = ["All","None"]
...

Я не проверял это сам, но это должно сработать. Мне потребовалось 10 минут, чтобы прочитать документы Eureka на GitHub. Может стоит попробовать ;)

person Preefix    schedule 21.09.2020
comment
Это черт его для меня! Большое спасибо, сэр. Я перебрал все строки, но запутался, потому что получил массив строк, что я понимаю сейчас :) - person Valentine; 28.09.2020