В iOS возникают проблемы с UITableView, программно выбирающим несколько ячеек и отображающим чек - PullRequest
1 голос
/ 07 июля 2019

У меня есть приложение, в котором пользователь может выбрать несколько элементов на UITableView. Затем они нажимают кнопку добавления, и он обновляет массив. Затем он перематывает назад к предыдущему VC. Теперь, когда пользователь нажимает, чтобы вернуться, чтобы обновить выбор.

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

Когда пользователь выбирает ячейку, didSelect должен добавить эту опцию в массив, если это еще не сделано. Когда пользователь отменяет выбор, вызывается ячейка didDeselect и элемент удаляется из массива. (Также отображается галочка или нет).

Теперь проблема в том, что пользователь возвращается в ячейки, у которых не выбраны галочки, и когда он выбирает эту продажу, он вызывает didSelect вместо didDeselect. Кажется, что большинство учебных пособий и справки, которые я нашел, работают только для одного выбора, и я не могу выделить ячейку. Смотрите изображения для более подробного разъяснения.

НОВЫЙ ВЫПУСК / ОБНОВЛЕНИЕ

Ну, первоначальная проблема исправлена. Теперь, когда я выбираю элемент 0 массива, элемент 10 массива также изменяет принадлежность. Это также повторяется постепенно.

это мои настройки массива

let expansionBayList: [ExpansionBay] = [ArcaneLaboratory(), CargoHold(), EscapePods(), GuestQuarters(), HangarBay(),
                            LifeBoats(), MedicalBay(), PassengerSeating(), PowerCoreHousing(), RecreationSuiteGym(),
                            RecreationSuiteTrividDen(), RecreationSuiteHAC(), ScienceLab(), SealedEnviromentChamber(), ShuttleBay()]

Поэтому, когда я выбираю Arcane Laboratory из списка, в Recreation Suite Trivid Den также есть галочка, но она не выбрана. Я предполагаю, что это как-то связано с reuseIdentifier? Я предполагаю, что мне нужно очистить, когда я прокручивал?

Я попробовал следующее (я устал в cellForRowAt):

cell.isSelected = true
cell.isHighlighted = true

Также я попробовал следующее (в viewDidLoad):

multiSelectTbl.allowsMultipleSelection = true
multiSelectTbl.allowsSelectionDuringEditing = true

Это первый раз, когда пользователь обновляет этот экран.

enter image description here

Это то, что происходит, когда пользователь выбирает залив расширения на предыдущем экране для обновления и внесения изменений. Как сделать так, чтобы каждая ячейка с галочкой была также выделена, как на первом изображении?

Существует массив, который определяет, какие поля должны иметь галочку.

enter image description here

Ответы [ 3 ]

1 голос
/ 07 июля 2019

Переопределить метод setSelected в пользовательском классе ячеек таблицы,

и используйте функцию tableview.selectRow(at:) для выбора ячеек.

Используйте tableView.indexPathsForSelectedRows, чтобы получить выбранные indexPaths в таблице.

Вот хорошая реализация. https://github.com/yonat/SelectionList

Ответить на новый выпуск: Пожалуйста, следуйте инструкциям.

  1. viewDidLoad или viewWillAppear метод

        var itemsToBeSelected: [String]?
        var listItems: [String]? 
    
        ....
        override func viewDidLoad() {
            super.viewDidLoad()
            if let selected = self.itemsToBeSelected, let listItems = self.listItems {
                selected.forEach { (item) in
                if let index = listItems.index(of: item) {
                    let indexPath = IndexPath(item: index, section: 0)
                    self.tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
                }
            }
        }        
    

    self.itemsToBeSelected означает, что они должны быть выбраны по умолчанию в списке, когда появляется контроллер вида. это просто массив String в приведенном выше примере.

  2. cellForRowAt метод

    Не нужно звонить cell.isSelected = true/false или cell.isHighlighted = true/false

    если ячейка является пользовательской ячейкой, вы можете просто применить содержимое только к ячейке. а в пользовательском классе ячеек просто переопределите метод setSelected.

    class ExpansionBayCell {
        ....
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
            self.checkBox.isChecked = self.isSelected
        }
    }
    
  3. когда пришло время получить все выбранные значения и закрыть контроллер вида

    func btnDonePressed() {        
        guard let indexPaths = tableView.indexPathsForSelectedRows else {
            btnBackPressed()            
            return
        }
    
        let items = indexPaths.map { self.listItems[$0.row] }
        completion(items)
        btnBackPressed()
    }
    
0 голосов
/ 07 июля 2019

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

Например: -

self.tableView.allowsMultipleSelection = true
self.tableView.allowsMultipleSelectionDuringEditing = true

Затем создайте CustomTableViewCell, который будет подкласс UITableViewCell. Переопределите метод setSelected.

Например: -

class CustomTableViewCell: UITableViewCell {
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        self.accessoryType = selected ? .checkmark : .none
    }
}

Теперь вы можете использовать собственную ячейку в методе cellForRow:

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", 
    for: indexPath) as? CustomTableViewCell
cell.setSelected(isSelected, animated: true)
0 голосов
/ 07 июля 2019

Чтобы установить начальное выбранное состояние для строк, вы должны использовать tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)

Я не знаю, как именно работает выбор UITableView, но кажется, что флаг isSelected на UITableViewCell предназначен только для рендеринга. Поэтому, если вы установите isSelectedна ячейке tableView не был выбран и вызывает didSelect вместо didDeselect

...