Search code examples
xcodeswiftuicolorcolor-spacecgcolor

CGColor not defined for the UIColor, need to first convert colorspace. Swift 2, Xcode 7


I was trying to change the color of my app´s buttons by creating the color using sliders to select the values of Red, Green, Blue and Alpha. So I created an variable which held the color created by the user.

ViewController is where the buttons are. ChangeColors is the RGB Sliders System.

import UIKit

import Foundation

var buttonColor = UIColor()

class ViewController: UIViewController {

@IBOutlet var tools: UIButton!

@IBOutlet var custom: UIButton!

@IBOutlet var support: UIButton!

@IBOutlet var donate: UIButton!



override func viewDidLoad() {
    super.viewDidLoad()

    tools.backgroundColor = buttonColor
    custom.backgroundColor = buttonColor
    support.backgroundColor = buttonColor
    donate.backgroundColor = buttonColor
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
}

The second is the code of te RGB Slider System.

import Foundation

import UIKit

class ChangeColors: UIViewController {

@IBOutlet var Red: UISlider!

@IBOutlet var Green: UISlider!

@IBOutlet var Blue: UISlider!

@IBOutlet var Alpha: UISlider!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func preview(sender: AnyObject) {

    let rVal = CGFloat(Red.value)
    let gVal = CGFloat(Green.value)
    let bVal = CGFloat(Blue.value)
    let aVal = CGFloat(Alpha.value)

    self.view.backgroundColor = UIColor(red: rVal, green: gVal, blue: bVal, alpha: aVal)
}

@IBAction func change(sender: AnyObject) {

    let rVal = CGFloat(Red.value)
    let gVal = CGFloat(Green.value)
    let bVal = CGFloat(Blue.value)
    let aVal = CGFloat(Alpha.value)
    let color = UIColor(red: rVal, green: gVal, blue: bVal, alpha: aVal)

    buttonColor = color

}

}

But the app crashes as soon as it open and get the following error:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -CGColor not defined for the UIColor ; need to first convert colorspace.

I really need help. Thank You.


Solution

  • The problem is that an instance created by the UIColor() initialiser doesn't represent an actual color. If you look at the crash message in more detail, you'll see that it actually creates a UIPlaceholderColor instance – which (as the name suggests) appears to act as a 'placeholder' in the absence of any color information. Therefore you can't assign it to the backgroundColor of any of your views.

    The fix is define a default color for your buttonColor. In your case I'd advise clearColor.

    var buttonColor = UIColor.clearColor()