Самый простой способ конвертировать выделение строк из UIPicker в UIColor? - PullRequest
0 голосов
/ 11 января 2019

Я практикую делегатов, и в своем тренировочном проекте я пытаюсь позволить пользователю выбрать свой любимый цвет из средства выбора, а затем использовать этот цвет (как UIColor) в методе делегата.

Для ясности, это мой простой протокол:

protocol PersonDelegate {
    func makePerson(name: String, color: UIColor)
}

И у меня есть массив цветов для выбора:

let colors = ["Red", "Orange", "Yellow", "Green", "Blue", "Cyan", "White", "Black"]

И затем пустая строковая переменная для передачи выбора пользователя в:

var favoriteColor = ""

Мои методы выбора:

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return colors.count
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    favoriteColor = colors[row]
}

И теперь, когда нажата кнопка «Готово», вызывается метод делегата, и мне нужно предоставить UIColor. Сейчас очевидно, что это не работает, потому что я пытаюсь передать String, когда требуется UIColor:

@IBAction func doneButtonPressed(_ sender: Any) {

    let name = nameTextField.text
    let myColor = favoriteColor

    personDelegate.makePerson(name: name!, color: myColor)

    dismiss(animated: true, completion: nil)
}

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

РЕДАКТИРОВАТЬ: полный код до сих пор

protocol PersonDelegate {
    func makePerson(name: String, color: UIColor)
}

class DelegateController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var colorPicker: UIPickerView!
var personDelegate: PersonDelegate!
let colors: [(string: String, color: UIColor)] = [("Red", .red), ("Orange", .orange), ("Yellow", .yellow), ("Green", .green), ("Blue", .blue), ("Cyan", .cyan)]
var favoriteColor: UIColor

override func viewDidLoad() {
    super.viewDidLoad()

}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return colors.count
}

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

@IBAction func doneButtonPressed(_ sender: Any) {

    let name = nameTextField.text
    let myColor = favoriteColor

    personDelegate.makePerson(name: name!, color: myColor)

    dismiss(animated: true, completion: nil)
}

1 Ответ

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

Создать словарь [String : UIColor]:

let dict = ["Red": UIColor.red, "Green": UIColor.green, ...]

Тогда просто посмотрите на цвет с помощью строки:

let color = dict[favoriteColor]!

Или вы можете сделать из пары colors массив String и UIColor:

let colors: [(string: String, color: UIColor)] = [("Red", .red), ("Green", .green)]

Тогда, когда вам нужна строка:

colors[row].string

и когда вам нужен цвет:

colors[row].color
...