2015-01-12 2 views
10

Я хочу использовать NSTimer в классе, который не наследуется от UIViewVontroller. У меня есть 2 файла: а ViewController и TimerClass так:NSTimer не находит селектор

ViewController:

import UIKit 

class ViewController: UIViewController { 

    var timerClass = TimerClass() 

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

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

} 

TimerClass:

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") 
    } 
} 

Когда я запускаю это приложение, у меня есть аварии с:

2015-01-12 19: 48: 24.322 Timer_TEST [5829: 185651] *** NSForwarding: предупреждение: объект 0x7fbc3be20710 класса 'Timer_TEST.TimerClass' не реализует методSignatureForSelector: - проблема впереди Непризнанный селектор - [Timer_TEST.supportFile timerEnd]

Любая идея?

Спасибо

+0

Я очень мало знаю о Swift, но он просит метод, и он не реализован в вашем пользовательском классе ... вы могли бы попробовать сделать это? –

+0

Вы не должны использовать 'var timer' в функции' launchTimer', а просто 'timer', потому что вы хотите получить доступ к свойству, верно? –

ответ

29

EDIT: Обратите внимание, что начиная с Swift 2.2 вы не сможете сделать эту ошибку! Вы будете использовать новый синтаксис #selector (см. https://stackoverflow.com/a/35658335/341994), и компилятор не позволит вам сформировать селектор для метода, который не подвергается Objective-C.


Это просто вопрос подвергая Swift функцию Objective-C, так что она видна Objective-C. У вас есть четыре варианта:

  • Make TimerClass спускающихся из NSObject (и удалить init реализации):

    class TimerClass : NSObject { 
    
  • Объявить TimerClass с @objc [не в Swift 2.0; использовать предыдущий выбор вместо]:

    @objc TimerClass { 
    
  • Объявляет функцию с @objc:

    @objc func timerEnd() 
    
  • Объявить функцию dynamic (это, пожалуй, худший выбор, так как это не является необходимым - функция не, его не нужно изменять на месте Objective-C, его просто необходимо увидеть):

    dynamic func timerEnd(){ 
    
+0

Спасибо, это просто отлично! – soling

+1

Он работает, спасибо. Любое логическое объяснение? – Rivera

+2

@Rivera Это просто вопрос разрешения Objective-C на _see_ функцию Swift. Вы должны каким-то образом подвергнуть его Objective-C. Я изменил свой ответ, чтобы предложить некоторые дополнительные подходы. – matt

Смежные вопросы