1

我不知道如何使用带有参数的方法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在运行时收到一条消息。

4

2 回答 2

2

计时器方法的选择器采用一个参数,即计时器本身(您无需在选择器中指定任何参数——它应该只是@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];

}
于 2012-09-02T21:52:25.157 回答
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
}
于 2013-08-14T11:57:26.913 回答