1

で引数を持つメソッドの使い方がわかりませんNSTimer。私が使用しているコードは以下のとおりです。ラベルが最初のメソッドに送信され、そこで赤くなり、2 番目のメソッドが呼び出されてラベルが黒くなるという考えがあります。

-(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

タイマー メソッドのセレクターは、タイマー自体である 1 つの引数を取ります (セレクターで引数を指定しないでください。@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他の情報が必要な場合は、 for に辞書を渡すこともできます。

[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 に答える