Search code examples
iosxcodeswiftuipickerviewxcode6gm

How do I change the text color of UIPickerView with multiple components in Swift?


Below code will change the font colour of the picker view of all 3 components. However, it crash when I try to spin the wheel. I think it has to do with the didSelectRow function. Maybe the two function have to be nested somehow? Any idea?

    func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
    var attributedString: NSAttributedString!
    if component == 0 {
        attributedString = NSAttributedString(string: a.text!, attributes: [NSForegroundColorAttributeName : UIColor.redColor()])
    }
    if component == 1 {
        attributedString = NSAttributedString(string: b.text!, attributes: [NSForegroundColorAttributeName : UIColor.redColor()])
    }
    if component == 2 {
        attributedString = NSAttributedString(string: c.text!, attributes: [NSForegroundColorAttributeName : UIColor.redColor()])
    }
    return attributedString
}


func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){

    switch component {
    case 0:
        aOutput.text = a[row]      -->  **Code breaks**
    case 1:
        bOutput.text = b[row]
    case 2:
        cOutput.text = c[row]
    default:
        10
    }

Solution

  • The following pickerView:attributedTitleForRow:forComponent: method implementation should help you:

    func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
        let attributedString = NSAttributedString(string: "some string", attributes: [NSForegroundColorAttributeName : UIColor.redColor()])
        return attributedString
    }
    

    Update

    If you want to use attributedString in multiple if or switch statements, the following UIViewController subClass example will help you:

    import UIKit
    
    class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
        @IBOutlet weak var picker: UIPickerView!
    
        let arrayOne = ["One", "Two", "Three", "Four", "Five", "Six"]
        let arrayTwo = ["Un", "Deux", "Trois", "Quatre", "Cinq", "Six"]
        let arrayThree = [1, 2, 3, 4, 5, 6]
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            picker.delegate = self
            picker.dataSource = self
        }
    
        func numberOfComponentsInPickerView(_: UIPickerView) -> Int {
            return 3
        }
    
        func pickerView(_: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            switch component {
            case 0:
                return arrayOne.count
            case 1:
                return arrayTwo.count
            case 2:
                return arrayThree.count
            default:
                return NSNotFound
            }
        }
    
        func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
            var attributedString: NSAttributedString!
    
            switch component {
            case 0:
                attributedString = NSAttributedString(string: arrayOne[row], attributes: [NSForegroundColorAttributeName : UIColor.redColor()])
            case 1:
                attributedString = NSAttributedString(string: arrayTwo[row], attributes: [NSForegroundColorAttributeName : UIColor.redColor()])
            case 2:
                attributedString = NSAttributedString(string: toString(arrayThree[row]), attributes: [NSForegroundColorAttributeName : UIColor.redColor()])
            default:
                attributedString = nil
            }
    
            return attributedString
        }
    
        func pickerView(_: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            switch component {
            case 0:
                println(arrayOne[row])
            case 1:
                println(arrayTwo[row])
            case 2:
                println(arrayThree[row])
            default:
                break
            }
        }
    
    }