MLyck
MLyck

Reputation: 5765

Swift Extension Class Function only works in 1 file

I have a file called UIElements.swift which contains some extension I want to use throughout my app.

They've worked great so far. Until I created a new viewController, and I can't get any of them to work in that or any other viewControllers I make. They only work in my first viewController?

Here's the code for the extension file:

import UIKit

extension UIImage {
    //create image from UIColor, to use for buttons
    class func imageWithColor(color:UIColor?) -> UIImage! {
        let rect = CGRectMake(0.0, 0.0, 1.0, 1.0);
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        let context = UIGraphicsGetCurrentContext();
        if let color = color {
            color.setFill()
        }
        else {
            UIColor.whiteColor().setFill()
        }
        CGContextFillRect(context, rect);
        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
}

Obviously I have more extensions in the file, but this is the function I was trying to call first when I noticed it didn't work.

Here is the code that doesn't work, in a file called Login_VC.swift

import UIKit

class LoginVC: UIViewController {

    override func viewDidLoad() {

        super.viewDidLoad()

        var signInButton = UIButton()
        signInButton.setTranslatesAutoresizingMaskIntoConstraints(false)
        signInButton.setTitle("SIGN IN", forState: .Normal)
        signInButton.titleLabel!.font =  UIFont(name: "BebasNeue-Bold", size: 50)
        signInButton.setBackgroundImage(UIImage.imageWithColor(UIColor.colorWithHex("#12D99E")), forState: .Normal)
        self.view.addSubview(signInButton)

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

The above code returns this following error:

'UIImage.Type' does not have a member named 'imageWithColor'

and here is a similar button in the first view controller I made called LandingPageVC.swift (this code works fine)

import UIKit

class LandingPageVC: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()


    var signUpButton: UIButton = UIButton()
    signUpButton.setTranslatesAutoresizingMaskIntoConstraints(false)
    signUpButton.setTitle("Sign Up Today", forState: .Normal)
    signUpButton.titleLabel!.font =  UIFont(name: "BebasNeue-Bold", size: 50)
    signUpButton.setBackgroundImage(UIImage.imageWithColor(UIColor.colorWithHex("#12D99E")), forState: .Normal)
    signUpButton.setBackgroundImage(UIImage.imageWithColor(UIColor.colorWithHex("#0DB07F")), forState: .Highlighted)
    signUpButton.layer.shadowColor = formulaShadowColor.CGColor
    signUpButton.layer.shadowOffset = CGSizeMake(3, 3)
    signUpButton.layer.shadowRadius = 0
    signUpButton.layer.shadowOpacity = 1.0
    signUpButton.addTarget(self, action: "signUp:", forControlEvents: .TouchUpInside)
    signUpButton.addTarget(self, action: "signUpHighlighted:", forControlEvents: .TouchDown)
    signUpButton.addTarget(self, action: "signUpReset:", forControlEvents: .TouchDragExit)
    self.view.addSubview(signUpButton)

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

}

I can't see anything I've done differently in either file.

yet when I start writing UIImage.i -> it suggests imageWithColor in the first view controller, but it doesn't show up in any other file.

I didn't do anything to import this class in either file. As it's just an extension of UIImage, it should be imported with UIKit.

I also tried adding public to the class, which didn't do anything.

can anyone explain why this function works in one file, but not the other?

Upvotes: 0

Views: 1744

Answers (2)

MLyck
MLyck

Reputation: 5765

I sent a bug-report to apple about this

Since this question has been untouched for a while not. I ended up creating a new project and copying my files over. It's working now. Still have no clue as to why it failed to work. The files are the same, same structure, same names, same targets.

Upvotes: 0

user3857868
user3857868

Reputation:

Have you tried cleaning out your project (Command-Option-Shift-K)? Cleaning your project empties out the Xcode cache. Even better is to quit your project and clean out ~/Library/Developer/Xcode/DerivedData manually. Make sure you delete everything in this folder, as the bug could be cached in any file.

Upvotes: 1

Related Questions