2015-01-12 7 views
10

UIViewVontroller에서 상속받지 않는 클래스에서 NSTimer를 사용하고 싶습니다. 의 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 : 경고 : 'Timer_TEST.TimerClass'클래스의 0x7fbc3be20710 객체가 methodSignatureForSelector를 구현하지 않습니다. - trouble ahead 인식 할 수없는 선택기 - [Timer_TEST.supportFile timerEnd]

아이디어가 있으십니까?

는 당신에게 감사

+0

Swift에 대해서는 거의 알지 못합니다. 그러나 메소드를 요청하고 있으며 사용자 정의 클래스에 구현되어 있지 않습니다. 그렇게 할 수 있습니까? –

+0

'launchTimer' 함수에서'var timer'를 사용하지 말고'timer' 만 사용하면됩니다. –

답변

29

편집 : 스위프트 2.2에 시작하는이 실수를 할 수 없습니다주의! 새 #selector 구문을 사용합니다 (https://stackoverflow.com/a/35658335/341994 참조). 그러면 컴파일러에서 Objective-C에 노출되지 않은 메서드의 선택기를 구성 할 수 없습니다.


이것은 Swift 기능을 Objective-C에 노출시켜 Objective-C에 표시되도록하는 것입니다.

  • 이 TimerClass을 확인 NSObject의에서 내려 (그리고 init 구현을 삭제) : 당신은 네 가지 선택 사항이 있습니다

    class TimerClass : NSObject { 
    
  • 하지 스위프트 2.0 @objc [함께 TimerClass를 선언; 함수가 - 그것은 불필요로이 아마 최악의 선택 (기능 dynamic를 선언

    @objc func timerEnd() 
    
  • :

    @objc TimerClass { 
    
  • @objc으로 함수를 선언 : 대신 이전 선택]를 사용하세요 동적이 아니며 Objective-C로 바꿔야 할 필요는 없습니다. 그냥 볼 수 있어야합니다.

    dynamic func timerEnd(){ 
    
+0

고마워, 그게 완벽 해! – soling

+1

감사합니다. 모든 논리 설명? – Rivera

+2

@Rivera 그것은 단지 Objective-C가 Swift 기능을 사용할 수 있도록 허용하는 것입니다. Objective-C에 일부러 의도적으로 노출시켜야합니다. 몇 가지 추가 접근법을 제공하기 위해 내 대답을 수정했습니다. – matt