Статьи

Заполнение UIPickerView в Swift


Я подумал, что было бы интересно добавить элемент
управления выбора (который разработчики Flex будут
называть SpinnerList ) в мой
набор цветов на основе набора . Новый элемент управления имеет жестко закодированный список цветов — если выбран один из этих цветов, он обновляет элементы управления набором RBG и CMYK и, наоборот, когда любой из элементов управления набором создает цвет, который соответствует палитре, он устанавливает свой выбранный элемент. соответственно.

Вместо расширения
UIPickerView я выбрал композицию и добавил экземпляр моего нового компонента ColorSpinner, который является расширенным элементом
управления пользовательского интерфейса.
UIPickerViews требуют два важных свойства — делегат, который реализует
Протокол UIPickerViewDelegate и источник данных, который реализует
протокол
UIPickerViewDataSource .

Я сделал хост-компонент
ColorSpinner , как источник данных, так и делегат.

В отличие от списков во Flex,
UIPickerView не принимает коллекцию, а вызывает методы для делегата, чтобы получить данные для определенных строк в источнике данных. Итак,
ColorSpinner имеет постоянный массив, который содержит
 структуры
NamedColor :

let colors = [
        NamedColor(name: "Custom", color: UIColor.clearColor()),
        NamedColor(name: "Red", color: UIColor.redColor()),
        NamedColor(name: "Green", color: UIColor.greenColor()),
        NamedColor(name: "Blue", color: UIColor.blueColor()),
        [...]

… и
UIPickerView вызывает
pickerView () с
параметром
titleForRow, чтобы заполнить себя:

func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String
    {
        return colors[row].name
    }

Когда пользователь делает выбор,
pickerView () с
didSelectRow вызывается, и я установить
ColorSpinner «ы
currentColor это множество.
DidSet наблюдатель , который вызывает свойство
sendActionsForControlEvents () так, чтобы главный контроллер представления может ответить:

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)
    {
        currentColor = colors[row].color
    }

Этот наблюдатель также вызывается, когда контроллер устанавливает цвет счетчика, когда изменяется один из переключателей на основе набора. Затем я зацикливаюсь на массиве, нахожу любые совпадения и
выбранный индекс
UIPickerView . Это простой цикл, который использует
ключевое слово
enumerate :

for (index, namedColor) in enumerate(colors)
            {
                if namedColor.color.description == currentColor.description
                {
                    spinner.selectRow(index, inComponent: 0, animated: true)
                }
            }

Все три элемента управления (вращающийся регулятор, регулятор RGB и регулятор CMYK) работают вместе очень хорошо (хотя пользовательский интерфейс немного странный в портретном формате и лучше всего работает в альбомной ориентации). Анимированный переход в
UIPickerView — это приятное прикосновение, которое я скоро добавлю в свои элементы управления набором.

Как всегда, весь исходный код доступен в
моем репозитории GitHub .