在Objective-c中使用静态Swift方法时出现"No known class method for selector"错误。

19

我得到了Objective C的代码,需要为其添加额外的功能。由于我对Objective C非常不熟悉,所以尽可能多地使用Swift来完成将是非常理想的。

这是我的Swift文件/类:

import Foundation
import UIKit

@objc class ImageBarSize: NSObject{

  static func changeContadorImageSize(img:UIImage, newSize:CGSize) -> UIImage{
    UIGraphicsBeginImageContextWithOptions(newSize, true, 0.0)
    let x:CGFloat = 0
    let y:CGFloat = 0
    img.draw(in: CGRect(x:x,y:y,width:newSize.width,height:newSize.height))
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage;
  }
}

这是我的Objective C .m文件上的代码:

 imgBarCounter = [UIImage imageNamed:@"bar-counter-pd.png"]; 

 self.image = [ImageBarSize changeContadorImageSize:imgBarCounter newSize:CGSizeMake(300, 300)];

我得到了错误信息 "No known class method for selector 'changeContadorImageSize:newSize:'"。

我完成了整个桥接过程,而且我已经

 #import <WHS_Live_2-Swift.h>

在文件开头,一切似乎运行正常。 我已经查看了在这里SO上看起来相似的错误线程,但没有任何效果。


Objective-C 代码的来源是什么? - Wyetro
1个回答

12

看到这一行,你正在使用 Swift 3。

img.draw(in: CGRect(x:x,y:y,width:newSize.width,height:newSize.height))

在 Swift 3 中,第一个参数也被视为具有参数标签。您可以通过 Command-clicking on #import <YourProjectName-Swift.h> 查看它们导出到 Objective-C 的方式。(您可能需要等待 Xcode 完成索引。)在 Xcode 8 beta 6 中测试,您的类方法将变成这样: 统一所有参数的标签行为,包括第一个标签 (SE-0046)
+ (UIImage * _Nonnull)changeContadorImageSizeWithImg:(UIImage * _Nonnull)img newSize:(CGSize)newSize;

因此,您可能需要像这样调用它:

self.image = [ImageBarSize changeContadorImageSizeWithImg:imgBarCounter newSize:CGSizeMake(300, 300)];

或者,您可以将Swift方法更改为:

static func changeContadorImageSize(_ img:UIImage, newSize:CGSize) -> UIImage{

然后您可以像原始形式一样调用它:
self.image = [ImageBarSize changeContadorImageSize:imgBarCounter newSize:CGSizeMake(300, 300)];

啊,我明白了!非常感谢你提供的链接和解释,现在我理解了。 对于我来说,Command+Click #import 也是非常有用的东西,我之前不知道它的存在! 再次感谢 c: - Miguel Guerreiro
一年后,至少在Xcode 8.3.3中,Command+Click无法使用#import,至少对于<YourProjectName-Swift.h>是如此。但我可以将类名添加到我的代码中,然后控制或右键单击类名,选择“跳转到定义”,然后会出现一个选项,可以跳转到编码版本或派生/生成版本。后者通常能够澄清一些疑惑。 - Tony Adams
7
使用 Xcode 10.0。为了让整个东西工作,我不仅需要在 Swift 类前缀上 @objc ,还要在静态方法签名前面加上 @objc。 - Joss
先生,我也同意Guerreiro先生的观点,您关于导入的Command+Click非常有帮助。谢谢。 - ptdecker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接