2015-01-12 16 views
10

नहीं मिला है, मैं उस कक्षा में एनएसटीमर का उपयोग करना चाहता हूं जो UIViewVontroller से प्राप्त नहीं होता है। एक ViewController और ऐसे ही एक TimerClass:एनएसटीमर को चयनकर्ता

ViewController: मैं 2 फ़ाइलें

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 1 9: 48: 24.322 टाइमर_टीएसटी [5829: 185651] *** एनएसफ़ोरवर्डिंग: चेतावनी: कक्षा 'टाइमर_टेस्ट.इमर क्लास' का ऑब्जेक्ट 0x7fbc3be20710 विधि लागू नहीं करता है सिग्नेचरफॉर चयनकर्ता: - आगे 01 समस्याअपरिचित चयनकर्ता - [Timer_TEST.supportFile timerEnd]

कोई विचार?

धन्यवाद

+0

मुझे स्विफ्ट के बारे में बहुत कम पता है, लेकिन यह एक विधि मांग रहा है और यह आपके कस्टम क्लास पर लागू नहीं है ... क्या आप ऐसा करने का प्रयास कर सकते हैं? –

+0

आपको फ़ंक्शन 'लॉन्च टाइमर' में 'var timer' का उपयोग नहीं करना चाहिए, लेकिन केवल' टाइमर ', क्योंकि आप संपत्ति तक पहुंच चाहते हैं, है ना? –

उत्तर

29

संपादित करें: ध्यान दें कि स्विफ्ट 2.2 में प्रारंभ करते समय यह गलती करने में सक्षम नहीं होगा! आप नए #selector वाक्यविन्यास का उपयोग करेंगे (https://stackoverflow.com/a/35658335/341994 देखें), और संकलक आपको उस विधि के लिए चयनकर्ता बनाने नहीं देगा जो उद्देश्य-सी के संपर्क में नहीं है।


यह केवल स्विफ्ट फ़ंक्शन को उद्देश्य-सी में उजागर करने का एक प्रश्न है ताकि यह उद्देश्य-सी के लिए दृश्यमान हो।

  • TimerClass बनाओ NSObject के वंशज हैं (और init कार्यान्वयन हटाना):: आप चार विकल्प हैं

    class TimerClass : NSObject { 
    
  • @objc [स्विफ्ट 2.0 में नहीं के साथ TimerClass घोषित;

    @objc TimerClass { 
    
  • @objc साथ समारोह घोषित: बजाय पिछले चुनाव] का उपयोग

    @objc func timerEnd() 
    
  • समारोह dynamic घोषित (यह शायद सबसे खराब विकल्प है, के रूप में यह अनावश्यक है - समारोह है गतिशील नहीं; इसे उद्देश्य-सी द्वारा स्थानांतरित करने की आवश्यकता नहीं है, इसे केवल दृश्यमान होने की आवश्यकता है):

    dynamic func timerEnd(){ 
    
+0

धन्यवाद, यह बिल्कुल सही है! – soling

+1

यह काम करता है, धन्यवाद। कोई तर्क स्पष्टीकरण? – Rivera

+2

@ रिवरा यह उद्देश्य-सी को स्विफ्ट फ़ंक्शन _see_ करने की अनुमति देने का एक प्रश्न है। आपको किसी उद्देश्य से जानबूझकर उद्देश्य-सी पर इसका खुलासा करना होगा। मैंने कुछ और दृष्टिकोण प्रदान करने के लिए अपना जवाब संशोधित कर दिया है। – matt

संबंधित मुद्दे