Статьи

Реализация радио-подобного поведения в приложениях iOS

Одна из вещей, которые меня всегда расстраивали из-за разработки под iOS, — это отсутствие элементов управления выбором, таких как переключатели и раскрывающиеся списки. Эти элементы управления вездесущи на других платформах, и большинство пользователей довольны их использованием и поведением.

К счастью, можно приблизить поведение этих элементов управления с помощью UITableView. Apple рекомендует использовать галочки для отображения состояния выбора; однако, это не то, что вы получаете бесплатно — оно должно быть реализовано приложением для каждого табличного представления или раздела табличного представления, для которого это необходимо.

Потому что это такая общая метафора, MarkupKit «s  LMTableView класс теперь обеспечивает поддержку для реализации радио кнопки типа поведения автоматически. Установка режима выбора любого раздела в LMTableView«singleCheckmark» гарантирует, что в любой момент времени будет проверяться только одна строка. MarkupKit добавляет логическое checkedсвойство к UITableViewCellклассу, чтобы приложение могло получить или установить состояние выбора ячейки.

Например, следующая разметка создает табличное представление, которое позволяет пользователю выбрать одно значение из списка параметров размера. Параметр «Большой» установлен по умолчанию:

<LMTableView style="groupedTableView">
    <?sectionSelectionMode singleCheckmark?>

    <UITableViewCell textLabel.text="Small"/>
    <UITableViewCell textLabel.text="Medium"/>
    <UITableViewCell textLabel.text="Large" checked="true"/>
    <UITableViewCell textLabel.text="Extra-Large"/>
</LMTableView>

Эта разметка производит вывод, подобный следующему:

Радио-кнопки

Следующий код Swift дает тот же результат, хотя и более многословно:

var tableView = LMTableView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), style: UITableViewStyle.Grouped)

tableView.setSelectionMode(LMTableViewSelectionMode.SingleCheckmark, forSection: 0)

var smallCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
smallCell.textLabel!.text = "Small"

tableView.insertCell(smallCell, forRowAtIndexPath: NSIndexPath(forRow: 0, inSection: 0))

var mediumCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
mediumCell.textLabel!.text = "Medium"

tableView.insertCell(mediumCell, forRowAtIndexPath: NSIndexPath(forRow: 1, inSection: 0))

var largeCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
largeCell.textLabel!.text = "Large"

largeCell.checked = true

tableView.insertCell(largeCell, forRowAtIndexPath: NSIndexPath(forRow: 2, inSection: 0))

var extraLargeCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
extraLargeCell.textLabel!.text = "Extra-Large"

tableView.insertCell(extraLargeCell, forRowAtIndexPath: NSIndexPath(forRow: 3, inSection: 0))

Установка режима выбора раздела «множественные контрольные отметки» включает поведение выбора, аналогичное коллекции флажков на других платформах. Например, следующая разметка создает список выборов домашних животных, из которых пользователь может выбрать ноль или более значений. «Кошка» и «Черепаха» отмечены по умолчанию:

<LMTableView style="groupedTableView">
    <?sectionSelectionMode multipleCheckmarks?>

    <UITableViewCell textLabel.text="Dog"/>
    <UITableViewCell textLabel.text="Cat" checked="true"/>
    <UITableViewCell textLabel.text="Fish"/>
    <UITableViewCell textLabel.text="Rabbit"/>
    <UITableViewCell textLabel.text="Turtle" checked="true"/>
</LMTableView>

Эта разметка производит вывод, подобный следующему:

Флажки

MarkupKit также добавляет valueсвойство UITableViewCell, позволяющее приложению связывать необязательное значение с ячейкой, аналогично атрибуту «value» элемента <option>HTML <select>. Например, следующая разметка создает табличное представление, которое позволяет пользователю выбрать цвет. Контроллер табличного представления реагирует на изменения выбора, применяя значение выбранной ячейки в качестве цвета фона другой ячейки:

<LMTableView style="groupedTableView">
    <?sectionSelectionMode singleCheckmark?>

    <UITableViewCell textLabel.text="Red" value="#ff0000"/>
    <UITableViewCell textLabel.text="Yellow" value="#ffff00"/>
    <UITableViewCell textLabel.text="Green" value="#00ff00"/>
    <UITableViewCell textLabel.text="Blue" value="#0000ff"/>
    <UITableViewCell textLabel.text="Purple" value="#ff00ff"/>

    <?sectionBreak?>

    <UITableViewCell id="selectedColorCell" textLabel.text="Selected Color"/>
</LMTableView>

Соответствующий код контроллера выглядит следующим образом:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var cell = tableView.cellForRowAtIndexPath(indexPath)
    var value = cell?.value as! String

    selectedColorCell.backgroundColor = LMViewBuilder.colorValue(value)
}

Полученный результат:

Палитра цветов

Эти новые функции управления выбором LMTableViewпозволяют значительно упростить обработку некоторых распространенных сценариев использования в дизайне приложений iOS.