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

时间:2016-08-29 21:44:50

标签: ios objective-c swift language-interoperability

我已经获得了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上查看了类似的错误线程,但无济于事。

1 个答案:

答案 0 :(得分:5)

看到这一行,你正在使用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)

您可以通过按住#import <YourProjectName-Swift.h> 命令来查看它们如何导出到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)];