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 发送了有关此问题的错误报告
因为这个问题已经有一段时间没有被触及了。我最终创建了一个新项目并复制了我的文件。它现在正在工作。仍然不知道为什么它无法工作。这些文件是相同的,相同的结构,相同的名称,相同的目标。
我有一个名为 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 发送了有关此问题的错误报告
因为这个问题已经有一段时间没有被触及了。我最终创建了一个新项目并复制了我的文件。它现在正在工作。仍然不知道为什么它无法工作。这些文件是相同的,相同的结构,相同的名称,相同的目标。