2010-04-16 19 views
27

के माध्यम से डेटा पास करना मैं एक एनएसटीमर कॉल के लिए userInfo के माध्यम से डेटा पास करने का प्रयास कर रहा हूं। इसे करने का बेहतरीन तरीका क्या है? मैं एक NSDictionary का उपयोग करने की कोशिश कर रहा हूं, जब मेरे पास उद्देश्य-सी ऑब्जेक्ट्स है, तो यह इतना आसान है, लेकिन अन्य डेटा के बारे में क्या है? मैं कुछ इस तरह है, जो उसी रूप में काम नहीं करता है क्या करना चाहते हैं:NSTimer UserInfo

- (void)play:(SystemSoundID)sound target:(id)target callbackSelector:(SEL)selector 
{ 
    NSLog(@"pause ipod"); 
    [iPodController pause]; 
    theSound = sound; 

    NSMutableDictionary *cb = [[NSMutableDictionary alloc] init]; 
    [cb setObject:(id)&sound forKey:@"sound"]; 
    [cb setObject:target forKey:@"target"]; 
    [cb setObject:(id)&selector forKey:@"selector"]; 

    [NSTimer scheduledTimerWithTimeInterval:0 
            target:self 
            selector:@selector(notifyPause1:) 
            userInfo:(id)cb 
            repeats:NO]; 
} 
+0

'cn' शून्य है जब आप '-notifyPause1:' प्राप्त करते हैं? –

उत्तर

7

आपका कॉल सही है, लेकिन आप आईडी पर शब्दकोश कास्ट करने के लिए नहीं है। आप userInfo निम्न पंक्ति के साथ वापस अपने notifyPause1 में प्राप्त कर सकते हैं: विधि:

- (void)notifyPause1:(NSTimer *)timer { 

    NSDictionary *dict = [timer userInfo]; 

} 
2

sound और selector ऑब्जेक्टिव-सी वस्तुओं नहीं हैं: sound एक अहस्ताक्षरित संख्या है और selector एक सी struct के लिए सूचक है। यह किसी तरह का दुर्घटना होने की संभावना है।

आप selector और NSNumber के मान को sound के मान रखने के लिए NSValue का उपयोग करना चाहेंगे। NSValue और NSNumber ऑब्जेक्ट्स हैं और NSMutableDictionary के साथ काम करेंगे।

0

शब्दकोश को निर्दिष्ट करते समय आपको अपनी ऑब्जेक्ट्स आईडी पर नहीं डालना चाहिए। किसी ऑब्जेक्ट को सीधे NSDictionary में एम्बेड किया जा सकता है, पहले से ही NSObject से निकला है और आईडी पर पूरी तरह से कंसित कलाकार हैं। स्टोर के रूप में चयनकर्ता के नाम एक NSString (NSStringFromSelector() का प्रयोग करके) और फिर इसे एक चयनकर्ता NSSelectorFromString()

क्लॉस

49

का उपयोग कर आप शब्दकोश में जानकारी सही ढंग से रैप करने के लिए है करने के लिए वापस परिवर्तित:

- (void) play:(SystemSoundID)sound target:(id)target callbackSelector:(SEL)selector 
{ 
    NSLog(@"pause ipod"); 
    [iPodController pause]; 
    theSound = sound; 

    NSMutableDictionary *cb = [[NSMutableDictionary alloc] init]; 
    [cb setObject:[NSNumber numberWithInt:sound] forKey:@"sound"]; 
    [cb setObject:target forKey:@"target"]; 
    [cb setObject:NSStringFromSelector(selector) forKey:@"selector"]; 

    [NSTimer scheduledTimerWithTimeInterval:0 
            target:self 
            selector:@selector(notifyPause1:) 
            userInfo:cb 
            repeats:NO]; 
    [cb release]; 

} 

notifyPause1: में, आप पुनः प्राप्त करने के लिए सब कुछ:

- (void)notifyPause1:(NSTimer *)timer { 
    NSDictionary *dict = [timer userInfo]; 

    SystemSoundID sound = [[dict objectForKey:@"sound"] intValue]; 
    id target = [dict objectForKey:@"target"]; 
    SEL selector = NSSelectorFromString([dict objectForKey:@"selector"]); 

    // Do whatever... 
} 

टाइमर एक दोहराना टाइमर है, आपको अब शब्दकोश की आवश्यकता नहीं है, इसलिए आप इसे छोड़ सकते हैं।

+0

एक सिर ऊपर - यदि आप अपने एनएसटीमर के लिए * अमान्य * कॉल करते हैं, तो * userInfo * तक पहुंचने से पहले * isValid * ध्वज को जांचना सुनिश्चित करें। यह * userInfo * प्रॉपर्टी के दस्तावेज़ों में कहा गया है, और मुझे बस उस सटीक जगह पर एक क्रैश पकड़ा गया है। – NAlexN

6

आप पद्धति चयनकर्ता के लिए दिया में टाइमर के लिए पूछ सकते हैं,

तो फिर तुम कि टाइमर से useInfo प्राप्त कर सकते हैं (timer.userInfo):

- (void)settingTimer 
{ 
[NSTimer scheduledTimerWithTimeInterval:kYourTimeInterval 
           target:self 
           selector:@selector(timerFired:) 
           userInfo:yourObject 
           repeats:NO]; 
} 

- (void)timerFired:(NSTimer*)theTimer 
{ 
    id yourObject = theTimer.userInfo; 
    //your code here 
} 
2

लॉरेंट एटींबल की विधि अच्छी तरह से काम UIViewcontroller के उप-वर्गों में टाइमर विधियों का अच्छा उपयोग करने के लिए जिसे आसानी से कई अलग-अलग दृश्य नियंत्रकों में उपयोग किया जा सकता है।

नीचे एक सामान्य स्कोर डिस्प्ले लिखने का एक तरीका है जिसका उपयोग एनएसटीमर उपयोगकर्ता इंफो के माध्यम से दृश्य को पार करके उसी ऐप में और अधिक उपयोग किया जा सकता है।

ज (UIViewController के उपवर्ग)

- (NSTimeInterval) timeSet; 
    - (void) timeRun: (UISegmentedControl*)scoreDisplay; 
    - (void) timeWrite: (NSTimer *)timer; 

मीटर

  - (NSTimeInterval) timeSet { 
       return [self.startTime timeIntervalSinceNow]; 
      } 

      - (void) timeWrite: (NSTimer *)timer 
      { 
       NSDictionary *dict = [timer userInfo]; 
       UISegmentedControl *scoreDisplay = [dict objectForKey:@"scoreDisplay"]; 

       int myint = round([self timeSet]); 
       NSString* buttonWrite = [[[NSString stringWithFormat:@"Score: %d", self.answered] stringByAppendingString:[NSString stringWithFormat:@" Errors: %d", self.errors]] stringByAppendingString:[NSString stringWithFormat:@" Time: %d", (myint*-1)]]; 

       [scoreDisplay setTitle:buttonWrite forSegmentAtIndex:0]; 
      } 

      - (void) timeRun: (UISegmentedControl*)scoreDisplay 
      { 
       self.startTime = [NSDate date]; 

       NSMutableDictionary *cb = [[NSMutableDictionary alloc] init]; 
       [cb setObject:scoreDisplay forKey:@"scoreDisplay"]; 

       self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1 
                   target:self 
                   selector:@selector(timeWrite:) 
                   userInfo:cb 
                   repeats:YES]; 

      } 

दृश्य नियंत्रक

में।एम

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     //load ScoreDisplay 
     [self timeRun:self.scoreDisplay]; 

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