Ошибка выбора всех ячеек таблицы одновременно |стриж - PullRequest
0 голосов
/ 08 ноября 2019

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

В настоящее время я использую:

for section in 0..<tableView.numberOfSections {
    for row in 0..<tableView.numberOfRows(inSection: section) {
        let indexPath = IndexPath(row: row, section: section)
        _ = tableView.delegate?.tableView?(tableView, willSelectRowAt: indexPath)
        tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
        tableView.delegate?.tableView?(tableView, didSelectRowAt: indexPath)
    }
}

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

ОБНОВЛЕНИЕ:

В didSelectRow я делаю следующее:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    structure[indexPath.row].isSelected.toggle()
    let portfolio = structure[indexPath.row]
    updateSelection(of: portfolio, at: indexPath)
}

Функция updateSelection - это просто функция, которая обновляет API с помощью Alamofire,

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Только что попробовал следующие методы в примере проекта, который работал, как вы хотите:

func selectAll() {
    for section in 0..<tableView.numberOfSections {
        for row in 0..<tableView.numberOfRows(inSection: section) {
            let indexPath = IndexPath(row: row, section: section)
            tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
        }
    }
}

func deselectAll() {
    for section in 0..<tableView.numberOfSections {
        for row in 0..<tableView.numberOfRows(inSection: section) {
            let indexPath = IndexPath(row: row, section: section)
            tableView.deselectRow(at: indexPath, animated: false)
        }
    }
}

Это то, что у вас не работает?

0 голосов
/ 11 ноября 2019

По вашему мнению ОБНОВЛЕНИЕ Похоже, что в табличном представлении есть только один раздел, поэтому ваш код вводит в заблуждение.

Простое решение - перечислить массив источника данных и проверить,isSelected имеет желаемое значение. Если нет, переключите значение и обновите API. Наконец перезагрузите представление таблицы. Вызов функции с помощью true выберет все ячейки, false отменит выбор ячеек.

func changeSelection(_ flag : Bool) {
    for (index, portfolio) in structure.enumerated() {
        if portfolio.isSelected != flag {
            structure[index].isSelected.toggle()
            updateSelection(of: structure[index], at: IndexPath(row: index, section: 0))
        }
    }
    tableView.reloadData()
}

Примечание:

Никогда вызовите методы делегата, содержащие will, did и should себя.

0 голосов
/ 08 ноября 2019
var selectedUsernameArray : NSMutableArray = []
var username1Array : NSMutableArray = ["hel","dsf","fsdg"]

// просто образец

Первоначально имя кнопки должно быть «Выбрать все»

Действие кнопки:

@IBAction func buttonAction(sender: UIButton) {

   if(sender.titleLabel?.text == "Select all")
    {
        selectedUsernameArray .addObjectsFromArray(username1Array as [AnyObject])
        sender.titleLabel?.text = "Deselect all"
    }
    else
   {
    selectedUsernameArray .removeAllObjects();
    sender.titleLabel?.text = "Select all"
    }

    self.tableView .reloadData()
}

табличный делегат

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    var ob: AnyObject = username1Array .objectAtIndex(indexPath.row);
    cell.textLabel?.text = ob as? String;
    if(selectedUsernameArray .containsObject(ob))
    {
      cell.backgroundColor = UIColor.blueColor();
    }
    else
    {
        cell.backgroundColor = UIColor.whiteColor();
    }
    return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...