Passing Data through NSTimer UserInfo

后端 未结 6 1880
抹茶落季
抹茶落季 2021-01-31 09:18

I am trying to pass data through userInfo for an NSTimer call. What is the best way to do this? I am trying to use an NSDictionary, this is simple enough when I have Objective-C

6条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-31 10:06

    Laurent Etiemble's method works well for making good use of timer methods in subclasses of UIViewcontroller which can be easily used in a number of different view controllers.

    Below is a way to write a generic score display which can be used over and over in the same app by passing the view through NSTimer userInfo.

    .h (subclass of UIViewcontroller)

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

    .m

                - (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];
    
                }
    

    In the view controller

    .m

      - (void)viewDidLoad
      {
           [super viewDidLoad];
    
           //load ScoreDisplay
           [self timeRun:self.scoreDisplay];
    
      }
    

提交回复
热议问题