web-dev-qa-db-ja.com

Objective-cでstatic Swiftメソッドを使用する場合、セレクターの既知のクラスメソッドがありません」

Objective Cコードが与えられたので、それに機能を追加する必要があります。私はObjectiveCにあまり詳しくないので、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;
  }
}

そしてこれは私のObjectiveC.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で同様のエラースレッドのように見えたものを調べましたが、役に立ちませんでした。

14

この行を見て、あなたはSwift 3を使用しています。

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

Swift 3)では、最初のパラメーターも引数ラベルを持つものとして扱われます。

最初のラベルを含むすべてのパラメーターで一貫したラベル動作を確立します(SE-0046)

Commandキーを押しながら#import <YourProjectName-Swift.h>をクリックすると、Objective-Cにエクスポートされる方法を確認できます。 (Xcodeがインデックス作成を終了するまで待つ必要があるかもしれません。)

Xcode 8ベータ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)];
8
OOPer