Галочка на статических ячейках uitableview

Я использую UITableView с 3 разделами (статические ячейки).

  • Валюта
  • Язык
  • Социальное

Они имеют разное количество рядов:

  • Валюта имеет 3 строки (USD, EUR, JPY)
  • Язык имеет 2 строки (EN, JP)
  • Социальные сети имеют 3 строки ( Twitter, FB, Line )

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

Мой вопрос заключается в том, как установить галочку для 3 разных разделов, каждый из которых имеет разное количество строк?

Нужно ли устанавливать идентификатор ячейки для каждого раздела? Нужно ли мне также создавать файл быстрого доступа UITableViewCell для каждого раздела?


person Gino    schedule 02.04.2015    source источник


Ответы (2)


Если галочки установлены в ответ на тап по ячейке, просто реализуем tableView(_:didSelectRowAtIndexPath:):

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let section = indexPath.section
    let numberOfRows = tableView.numberOfRowsInSection(section)
    for row in 0..<numberOfRows {
        if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: section)) {
            cell.accessoryType = row == indexPath.row ? .Checkmark : .None
        }
    }
    // ... update the model ...
}

В противном случае вы можете установить идентификаторы для каждой ячейки в вашей раскадровке (или выходов, если хотите, поскольку ячейки не используются повторно), а затем просто установить галочку программно. Например, используя метод делегата:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if let identifier = cell.reuseIdentifier {
        switch identifier {
            "USD Cell": cell.accessoryType = model.usdChecked ? .Checkmark : .None
            "EUR Cell": cell.accessoryType = model.eurChecked ? .Checkmark : .None
            //...
            default: break
        }
    }
}

Не должно быть необходимости создавать отдельный подкласс для каждого раздела/ячейки.

person Stuart    schedule 02.04.2015
comment
Похоже, это сработает, +1. Если на раздел может быть только 1 галочка, как мне тогда это сделать? Языковые настройки не могут быть одновременно EN и JP. Валютой может быть только доллар США, евро или японская иена. - person Gino; 02.04.2015
comment
@Gino Я обновил первый пример кода, чтобы поставить галочку только рядом с последней нажатой ячейкой в ​​данном разделе. Он просто перечисляет ячейки табличного представления в выбранном разделе и гарантирует, что только выбранная строка имеет галочку. - person Stuart; 02.04.2015
comment
Ого, я узнал много нового, чего не нашел в книге О'Рейли Свифт. Большое спасибо, приятель. +1 - person Gino; 02.04.2015
comment
Спасибо! сработало для меня, но я не знаю, лучшее ли это решение - person Bruno; 01.07.2016

Просто быстрое обновление для Swift 3:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let section = indexPath.section
        let numberOfRows = tableView.numberOfRows(inSection: section)
        for row in 0..<numberOfRows {
            if let cell = tableView.cellForRow(at: IndexPath(row: row, section: section)) {
                cell.accessoryType = row == indexPath.row ? .checkmark : .none
            }
        }
}
person hdoria    schedule 28.11.2016