我无法弄清楚如何使用具有NSTimer
参数的方法。我正在使用的代码如下 - 将标签作为标签发送到第一种方法,它被转为红色,然后在第二种方法被调用后,标签变为黑色。
-(void) highlightWord:(UILabel *)label
{
label.textColor = [UIColor colorWithRed:235 green:0 blue:0 alpha:1];
//[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(unhighlightWord:label) userInfo:nil repeats:NO];
}
- (void) unhighlightWord:(UILabel *)label {
label.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
}
使用这样的代码,Xcode告诉我:Expected ":"
之后的@selector(unhighlightWord:label
。如果我添加“:”,我会在运行时收到unrecognized selector
消息。
答案 0 :(得分:2)
timer方法的选择器接受一个参数,它是一个定时器本身(你没有在选择器中指定任何参数 - 它应该只是@selector(unhighlightWord :))。因此,您需要有一个指向您的标签的ivar或属性,并在您的方法中使用它,而不是尝试将标签作为参数传递。
-(void) highlightWord:(UILabel *)label
{
label.textColor = [UIColor colorWithRed:235 green:0 blue:0 alpha:1];
self.myLabel = label; // myLabel is a property
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(unhighlightWord:) userInfo:nil repeats:NO];
}
- (void) unhighlightWord:(NSTimer *) aTimer {
self.myLabel.textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
}
答案 1 :(得分:1)
接受的答案工作正常,但另一个(可能更好)解决方案是将标签传递给计时器的userData
:
-(void) highlightWord:(UILabel *)label
{
label.textColor = [UIColor colorWithRed:235 green:0 blue:0 alpha:1];
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(unhighlightWord:) userInfo:label repeats:NO];
}
- (void)unhighlightWord:(NSTimer *)aTimer {
if ([aTimer.userData isKindOfClass[UILabel class]]) {
((UILabel *)aTimer.userData).textColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
}
// can do other checks for different objects (buttons, dictionaries, switches, etc...)
}
如果您想使用相同的方法/机制来处理不同的标签(或者甚至是按钮之类的其他对象),假设您已经进行了正确的检查,那么这对丢失代码非常有用。
如果您需要其他信息,还可以为userData
传递字典:
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(unhighlightWord:) userInfo:@{@"sender": label, @"otherData", @"some important value"} repeats:NO];
然后在接收方法中,您可以像使用普通字典一样访问数据:
if ([aTimer.userData isKindOfClass[NSDictioanry class]]) {
// do something
}