2015-01-12 24 views
10

UIViewVontroller'dan devralmayan bir sınıfta bir NSTimer kullanmak istiyorum. Bir ViewController ve böyle bir TimerClass:NSTimer seçiciyi bulamadı

ViewController: Ben 2 dosya var

import UIKit 

class ViewController: UIViewController { 

    var timerClass = TimerClass() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewDidAppear(animated: Bool) { 
     timerClass.launchTimer() 
    } 

} 

TimerClass:

: Ben uygulamayı başlattığınızda

import Foundation 

class TimerClass { 

    var timer = NSTimer() 

    init(){} 

    func launchTimer(){ 
     var timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "timerEnd", userInfo: nil, repeats: true) 
    } 

    func timerEnd(){ 
     println("That worked") 
    } 
} 

, ben bir çökme var

2015-01-12 19: 48: 24.322 Timer_TEST [5829: 185651] *** NSForwarding: uyarı: nesne 'Timer_TEST.TimerClass' nesnesinin 0x7fbc3be20710 methodSignatureForSelector uygulamıyor: - sorun devam ediyor Tanınmayan seçici - [Timer_TEST.supportFile timerEnd]

Herhangi bir fikrin var mı?

teşekkür ederiz

+0

Swift hakkında çok az şey biliyorum, ama bir yöntem istiyor ve özel sınıfınızda uygulanmıyor ... bunu yapmayı deneyebilir miydiniz? –

+0

'launchTimer' işlevindeki' var timer'ı kullanmamalısınız, ancak yalnızca 'zamanlayıcı' özelliği kullanılmalıdır, çünkü mülke erişmek istediğinizde, değil mi? –

cevap

29

DÜZENLEME: Swift 2.2 başlayan bu hata yapmak mümkün olmayacaktır Not! Yeni #selector sözdizimini kullanacaksınız (bkz. https://stackoverflow.com/a/35658335/341994) ve derleyici, Objective-C'ye maruz kalmayan bir yöntem için bir seçici oluşturmanıza izin vermez.


O yüzden Objective-C tarafından görülebilir sadece Objective-C Swift işlevini ortaya çıkarmak gibi bir soru.

  • TimerClass olun NSObject soyundan (ve init uygulanmasını silme): Dört seçenek var

    class TimerClass : NSObject { 
    
  • değil Swift 2.0 @objc [ile TimerClass beyan; fonksiyon - bu gereksizdir olarak bu muhtemelen en kötü seçimdir (function dynamic beyan

    @objc func timerEnd() 
    
  • :

    @objc TimerClass { 
    
  • @objc ile işlevini bildirin: yerine önceki seçim] kullanmak dinamik değil; Objective-C tarafından yerinde değiştirilmesine gerek yoktur, sadece görünür olması gerekir):

    dynamic func timerEnd(){ 
    
+0

Teşekkürler, bu sadece mükemmel! – soling

+1

Çalışır, teşekkürler. Herhangi bir mantık açıklaması? – Rivera

+2

@Rivera Sadece Swift işlevinin _point_ nesnesine izin verilmesiyle ilgili bir soru. Nesnel-C'ye bir şekilde kasıtlı olarak maruz bırakmak zorundasınız. Daha fazla yaklaşım sağlamak için cevabımı değiştirdim. – matt