将带参数的方法传递给NSTimer

时间:2012-09-02 21:41:43

标签: objective-c ios

我无法弄清楚如何使用具有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消息。

2 个答案:

答案 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
}