Swift 扩展 Class 功能仅适用于 1 个文件

Swift Extension Class Function only works in 1 file

我有一个名为 UIElements.swift 的文件,其中包含一些我想在整个应用程序中使用的扩展。

到目前为止,他们工作得很好。在我创建一个新的 viewController 之前,我无法让他们中的任何一个在那个或我制作的任何其他 viewController 中工作。它们只适用于我的第一个 viewController?

这是扩展文件的代码:

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

显然我在文件中有更多的扩展名,但当我发现它不起作用时,这是我试图首先调用的函数。

这是不起作用的代码,位于名为 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.
    }
}

以上代码returns出现以下错误:

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

这是我制作的第一个视图控制器中的一个类似按钮 LandingPageVC.swift(这段代码工作正常)

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

}

我在两个文件中都看不到我所做的任何不同。

然而当我开始写 UIImage.i -> 它在第一个视图控制器中建议 imageWithColor,但它没有出现在任何其他文件中。

我没有做任何事情来将这个 class 导入到任何一个文件中。由于它只是 UIImage 的扩展,因此应使用 UIKit.

导入

我还尝试将 public 添加到 class,但没有任何效果。

谁能解释为什么这个函数在一个文件中有效,而在另一个文件中无效?

您是否尝试过清理您的项目 (Command-Option-Shift-K)?清理项目会清空 Xcode 缓存。更好的办法是退出您的项目并手动清除 ~/Library/Developer/Xcode/DerivedData。确保删除此文件夹中的所有内容,因为该错误可能缓存在任何文件中。

我向 apple 发送了有关此问题的错误报告

因为这个问题已经有一段时间没有被触及了。我最终创建了一个新项目并复制了我的文件。它现在正在工作。仍然不知道为什么它无法工作。这些文件是相同的,相同的结构,相同的名称,相同的目标。