2015-05-04 11 views
9

,Swift'deki seçiciden özel sınıf işlevi nasıl çağırılır? ben böyle yapıyorum Şu

çağrılması seçici olarak:

NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "startAnimation:", userInfo: loadingView, repeats: true) 

Seçici yöntemi olarak: Ben uyarıyı alma ve uygulama ediyorum

private class func startAnimation(timer:NSTimer){ 
    var loadingCircularView = timer.userInfo as UIView 
} 

çöker:

warning: object 0x67c98 of class ‘ClassName’ does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selector +[ClassName startAnimation:] 
+0

Özel yöntem yalnızca, nesnelerden değil, nesnelerden kullanılabilir. Bu yöntemi gizli tutmayı gerçekten istiyorsanız, özel yöntemle dahili olarak çağıran ortak bir sarıcı yöntemini yazın. – gutenmorgenuhu

+0

"Özel" anahtar sözcüğün kaldırılması yardımcı olmadı. –

+0

Yöntem nesnesinin başlangıcına '@ objc' ekleyin (bunun yanı sıra“ gizli değil ”) - bir sınıf yönteminin hala bir hedef/seçici olabileceğinden emin değilim. Ayrıca bu durumda, 'kendini' bir sınıf yönteminde değilseniz bir örnek. – Rich

cevap

1

Sınıf bildirimi sorunu çözdüğünde NSObject ekleniyor.

Ref: Sen olarak izleyin senin işlev yazabilirsiniz NSTimer scheduledTimerWithTimeInterval and target is "class level function"

class MyClass:NSObject{} 

gibi çağıran yöntem

NSTimer.scheduledTimerWithTimeInterval(0.5, target: ClassName.self, selector: Selector("startAnimation"), userInfo: nil, repeats: true) 

class func startAnimation(){} 
3

Seçicilere özel yöntemlerle çağrı yapamazsınız. Bu yöntemleri özel yapma bütün noktası, bu yüzden dışarıdan erişilebilir değildir.

Ayrıca, sınıf yöntemine hedef olarak self örneğini gönderiyorsunuz, bu yüzden çalışmaz. Bir sınıf göndermeniz veya sınıfı bir yöntemden kaldırmanız gerekir.

+0

Bir sınıfı hedefin bir örneği olarak nasıl gönderebilirim? –

+0

Sanırım sadece 'ClassName.self' ihtiyacın var –

+0

Yine çöküyor. –

4

1.:

@objc private class func startAnimation() {} 

veya

fonksiyon Dinamik Sevk Fonksiyon olduğunu dinamik, bunu bir Objective-C fonksiyonu gibi görünüyor yapılmış gibi hızlı bir işlev bildirmek zaman
dynamic private class func startAnimation() {} // not recommended 

(Objective-C Dynamic Sevk izler), ya da biz söyleyebiliriz Şu anda Selector'da çağrılabilen.

Ancak bu durumda, bu işlevin bir Dinamik Özellik olmasına izin vermemiz gerekiyor, bu nedenle @objc @ yeterlidir.

2. Eğer NSTimer hedef öz olmalıdır

@objc private func xxxxx(){} 

olarak işlev yazmak, ancak NSTimer içinde

@objc private class func xxxx(){} // Assuming your class name is 'MyClass' 

hedefi farklı işlevinizi yazarsanız gerektiği takdirde MyClass.self.

+0

Açık cevap için teşekkürler. @objc kullanırken dikkatli olmak için bazı downsides var mı? – dhfromkorea

+1

@dhfromkorea Sanırım yok. Aslında, bir viewcontroler'da özel bir func bildirmek istediğinizde, fakat dahili bir func (object) değil, objc gerekli olacaktır. –

4

sınıf fonksiyonunu değiştirerek ile ince Bu kullanabilirsiniz bir örnek işlevi olması durumunda:

performSelector(Selector(extendedGraphemeClusterLiteral: "aVeryPrivateFunction")) 

Not:

@objc private func aVeryPrivateFunction(){ 
    print("I was just accessed from outside") 
} 

: Böyle @objc ile özel fonksiyon işaretlemek emin olun daha fazla oku here

İlgili konular