Я подумал, что было бы интересно добавить элемент
управления выбора (который разработчики 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 .