2017-01-11 9 views
0

ここで私の考えが正しいかどうかはわかりませんが、私はiOSプロジェクト全体で同様のアニメーションを使用していますが、それを1ファイルに凝縮して、iOSビューでアニメーションを再利用する

簡単な例。私のアニメーションファイルでは、私は、スケールアニメーションを持って

Animations.swiftここで私は私のビューのフォルダに私の多くの迅速なファイルのいずれかを持っていると私はボタン

にそのアニメーションを追加したいと思い

class Animations { 

    class func scaleSmall(_ view: UIView) { 
     let scaleAnim = POPBasicAnimation(propertyNamed: kPOPLayerScaleXY) 
     scaleAnim?.toValue = NSValue(cgSize: CGSize(width: 0.9, height: 0.9)) 
     view.layer.pop_add(scaleAnim, forKey: "scaleSmallAnim") 
    } 

} 

Button.swift

class Button: UIButton { 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     self.addTarget(self, action: #selector(Animations.scaleSmall(_:)), for: .touchDown) 
    } 

} 

私は思っWOU ldはしかし、毎回私はそれを私は同じエラーを取得するこの方法を実行する追加のファイルからアニメーションを参照することができ

「#selector」の引数は、インスタンスメソッド「scaleSmall」のObjective-Cにさらされていないを指し、

この関数を間違って参照していますか?

+0

これは正しいことです。 SwiftクラスはObj-Cと完全に互換性がなく、 'UIKit'(つまり' UIButton')はObj-Cの世界にあります。あなたの 'Animations'クラスによって' NSObject'から継承するか、あなたのメソッドを '@ objc'としてマークすることができます。 – Losiowaty

+0

私にとって紛らわしいことは、ボタンクラスの中に#selector(Button.scaleSmall)でアクセスできるアニメーションがあれば、正しく動作するということです。まもなく私はそれをファイルから取り出します。私はそれを正しく得ることができません。 – user934902

答えて

1

@objc class func scaleSmall(view: UIView) { 
+0

クリーンな素早いファイルを維持しようとしていて、objcを混在させようとしない場合は、 – user934902

+0

はobjcとswiftコードを実際に混合していませんコンパイラのフラグです。 –

+0

それは私のエラーを取り除きますが、私が持っている次の問題は、アプリケーションが失敗した '認識できないセレクタがインスタンスに送られました'です。それを今調査しています – user934902

1

class func scaleSmall(_ view: UIView) {

を変更してみてください私は私のコメントを確認してきたので、私は答えを投稿しています。 UIButtonのメソッドはObj-Cにブリッジする必要があります。それは@Kostas Tsoleridisが彼の答えと共に示唆していることです - それは1つのファイルに2つの言語を混ぜることではなく、コンパイラのためのメソッドをマークしているだけです。他の解決策はAnimationsクラスによってNSObjectから継承することです。 OBJの-Cの世界からの両方であり、また、チェーンダウンNSObjectから継承あなたのButtonクラスがUIButtonから継承するため、それが働いていた - あなたの混乱はコメントで述べたように今

、。

@Kostas Tsoleridis答えのコメントに記載されている問題にも対処するには(これまで考えていたはずです) - selfをターゲットにして別のクラスのメソッドを使用することはできません静的なもの)。これを解決するには、次のようなAnimationsクラスのシングルトンインスタンスを使用できます。

class Animations { 
    static let sharedInstance = Animations() 
    @objc class func scaleSmall(_ view: UIView) { 
     // your code 
    } 
} 

let button = UIButton() 
button.addTarget(Animations.sharedInstance, action: #selector(Animations.scaleSmall(_:)), for: .touchDown) 
+0

あなたは今何を言っているのか見始めて – user934902

関連する問題