swift - 将字符串选择从 UIPicker 转换为 UIColor 的最简单方法?

标签 swift delegates protocols uipickerview

我正在练习委托(delegate),在我的练习项目中,我试图让用户从选择器中选择他们最喜欢的颜色,然后在委托(delegate)方法中使用该颜色(作为 UIColor)。

为清楚起见,这是我的简单协议(protocol):

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]
}

现在,当按下完成按钮时,将调用委托(delegate)方法,我需要提供一个 UIColor。现在显然它不起作用,因为我试图在需要 UIColor 时传入 String:

@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)
}

最佳答案

创建一个 [String : UIColor] 字典:

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

然后用字符串查找颜色:

let color = dict[favoriteColor]!

或者您可以让您的colors 数组与StringUIColor 配对:

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

然后当你需要字符串的时候:

colors[row].string

当你需要颜色时:

colors[row].color

关于swift - 将字符串选择从 UIPicker 转换为 UIColor 的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54152080/

相关文章:

ios - 如何在 Swift guard 语句中定义弱变量

ios - 编译器不符合 UIImagePickerControllerDelegate 协议(protocol)

swift - 如何为 UIPageViewControllerDataSource 提供默认实现?

ios - 关闭 UIImagePickerController 也会关闭呈现的 View Controller

ios - 如何在 Swift 3 中设置每天特定时间的闹钟?

ios - 使用从另一个表查询的用户 objectId 查询用户表

ios - @IBInspectable 在 Swift 4.0 中

ios - 为什么委托(delegate)方法可以在不声明协议(protocol)一致性的情况下工作?

arrays - 具有约束的数组类型的扩展不能有继承子句 - swift 2

c - 在 Raspberry pi 上安装 AODV 协议(protocol) (https ://github. com/erimatnor/aodv-uu)