前言
这篇文章记录了如何使用NSTimer以及通知来给执行的方法传递参数
正文
定时器传参
使用下面一行代码来在指定时间内是否周期性执行指定的方法
[NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(onTimer:) userInfo:dict repeats:NO];
可以看到onTimer后面有一个冒号,表示这个方法后面有一个参数。 那么我们如何给这个方法传递参数呢?请看onTimer方法的定义
- (void)onTimer:(NSTimer *)timer
{
UIView *oldView = [[timer userInfo] objectForKey:@"oldView"];
UIView *newView = [[timer userInfo] objectForKey:@"newView"];
[UIView animateWithDuration: delay:
options:UIViewAnimationOptionAllowUserInteraction
animations:^{
oldView.alpha = ;
newView.alpha = ;
}
}
注意一下这里的onTimer后面的参数,它是通过NSTimer这个类型的参数实例使用
[timer userInfo]
获取上面在
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(onTimer:) userInfo:dict repeats:NO];
中的userInfo指定的字典变量
important note: 使用[timer userInfo]来获取在userInfo中指定传递的参数时,一定要保证这个NSTimer(也就是上面代码通过
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(onTimer:) userInfo:dict repeats:NO];
产生的定时器变量) 没有使用
[self.searchTimer invalidate]; self.searchTimer = nil;
来让定时器失效,否则的话会出现EXC_BAD_ACCESS错误
通知传参
定义有参数 的通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(specifyModelInfoPrinting:) name:@"specifyModelInfoPrinting" object:nil];
specifyModelInfoPrinting方法带一个NSNotification参数
- (void)specifyModelInfoPrinting:(NSNotification *)notice {
self.nonLabel.hidden = YES;
self.printProgressView.hidden = NO;
self.printingDictInfomation = [notice userInfo];
}
使用NSNotification类型实例变量通过代码[notice userInfo]获取下面在userInfo指定的参数变量
[[NSNotificationCenter defaultCenter]postNotificationName:@"specifyModelInfoPrinting" object:nil userInfo:stlDict];
这里给userInfo指定的是一个字典,因此使用[notice userInfo]获取到的就是一个字典变量
performSelector传参
-(void) showMessageToUI:(NSString*) message {
MBProgressHUD *progress = [MBProgressHUD showHUDAddedTo:self animated:NO];
progress.labelText = message;
[self performSelector:@selector(hideHUD:) withObject:progress afterDelay:];
}
-(void) hideHUD:(MBProgressHUD*) progress {
__block MBProgressHUD* progressC = progress;
dispatch_async(dispatch_get_main_queue(), ^{
[progressC hide:YES];
progressC = nil;
});
}
从上面的代码可以知道,withObject后面跟上什么类型的变量,那么在对应执行方法后面就赋予什么类型的参数,⚠️:这里参数只能有一个,如果想要传递多个参数,那么存放到字典或者数组然后再传递
参考资料
通过NSTimer看IPhone对@selector的函数如何传参数