在 Objective-c 上使用静态 Swift 方法时,“选择器没有已知的类方法”

Posted

技术标签:

【中文标题】在 Objective-c 上使用静态 Swift 方法时,“选择器没有已知的类方法”【英文标题】:"No known class method for selector" when using static Swift method on Objective-c 【发布时间】:2016-08-29 21:44:50 【问题描述】:

我已经获得了 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)];

我收到错误“选择器'changeContadorImageSize:newSize:'没有已知的类方法”。

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

 #import <WHS_Live_2-Swift.h>

在文件的开头,一切似乎都运行良好。 我已经在 SO 上查看了似乎类似的错误线程,但无济于事。

【问题讨论】:

Objective-C 代码的来源? 【参考方案1】:

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

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

在 Swift 3 中,第一个参数也被视为具有参数标签。

Establish consistent label behavior across all parameters including first labels (SE-0046)

您可以通过Command-点击#import &lt;YourProjectName-Swift.h&gt;来检查它们是如何导出到Objective-C的。 (您可能需要等到 Xcode 完成索引。)

在 Xcode 8 beta 6 中测试,你的类方法变成这样:

+ (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)];

【讨论】:

啊,我明白了!非常感谢您的链接和解释,我现在明白了。 #import 上的 Command+Click 对我来说也非常有用,我不知道它存在!再次感谢 c: 一年后,至少在 Xcode 8.3.3 中,Command+Click on #import 不起作用,至少对我来说,对于 。但是,我可以将类名添加到我的代码中,然后控制或右键单击类名,然后选择“跳转到定义”,我将获得一个选项来跳转到编码版本或派生/生成版本.后者往往会解开一些谜团。 使用 Xcode 10.0。为了使整个工作正常,我不仅要为 swift 类加上前缀,还要在静态方法签名前加上 @objc。

以上是关于在 Objective-c 上使用静态 Swift 方法时,“选择器没有已知的类方法”的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 Swift 框架中的 Objective-C 文件上使用 Swift

静态类型的 NSUserDefaults

在 Swift 上委托 Objective-C 协议

在 Swift/Objective-c 中按媒体类型自定义图像选择器

#ifdef 下的 Objective-C 代码在 Swift 中不可见 [重复]

Swift 反射