0

我不能在 NSTimer 上使用 pokeme:@"1" 或 pokeme:1 或 pokeme:"sdfsdfs" 。我有错误出现。你如何解决这个问题?

- (void)Anything {

    [NSTimer scheduledTimerWithTimeInterval:06.00f target:self selector:@selector(Pokeme:@"1") userInfo:nil repeats:NO];
}

- (void)Pokeme:(NSString *)text {

}
4

4 回答 4

1

你不能这样做——选择器只是一个方法的名称,而该方法的参数将是计时器。您必须创建一个包含所需行为的新方法并将作为选择器传递,或者使用类似NSTimer+Blocks的方法。

于 2012-05-02T23:58:46.060 回答
1

您没有正确调用选择器,也没有在 -Pokeme: 上采用正确的参数。

  1. 您需要使用 @selector(Pokeme:) 调用选择器
  2. -PokeMe:需要将计时器作为参数(我建议您再次阅读NSTimer 文档)。
  3. 请务必使用 userInfo 在 -Pokeme 中传递您需要的任何数据:
于 2012-05-02T23:59:04.127 回答
0

这不是一个有效的选择器。选择器只是方法签名方法的名称,您不能将参数传递给它,因此您应该有

[NSTimer scheduledTimerWithTimeInterval:6.00f target:self selector:@selector(pokeMe:) userInfo:nil repeats:NO];

根据NSTimer文档,接收方法的签名应该不在表格中

- (void)timerFireMethod:(NSTimer *)theTimer

所以你应该将你的方法定义为

- (void)pokeMe:(NSTimer *)timer;

如果您想沿userInfo参数传递额外信息,则接受一种类型id并且可以从timer对象中检索。

一个工作示例是

[NSTimer scheduledTimerWithTimeInterval:06.00f target:self selector:@selector(pokeMe:) userInfo:@"I was passed" repeats:NO];

然后

- (void)pokeMe:(NSTimer *)timer;
{
    NSLog(@"%@", timer.userInfo);
}

#=> 2012-05-03 00:57:40.496 Example[3964:f803] I was passed
于 2012-05-03T00:02:27.933 回答
0

NSTimer Class Reference

这不是传递变量的正确方法,实际上会抛出编译器。用于userInfo传递一个对象,然后您可以将该对象转换为NSString您需要的任何内容。

/* INCORRECT */
[NSTimer scheduledTimerWithTimeInterval:06.00f target:self 
                        selector:@selector(Pokeme:@"1") userInfo:nil repeats:NO];

基本上,userInfo可以是一个对象:

NSString

/* Pass @"1" as the userInfo object. */
[NSTimer scheduledTimerWithTimeInterval:6 target:self 
                           selector:@selector(Pokeme:) userInfo:@"1" repeats:NO];

/* Convert the object to NSString. */
-(void)Pokeme:(NSTimer*)timer {
    NSString *passedString = (NSString*)timer.userInfo;
}

NS词典

/* Create an NSDictionary with 2 Key/Value objects. */
NSDictionary *passTheseKeys = [NSDictionary dictionaryWithObjectsAndKeys:
                                   @"Some String Value 1", @"StringKey1", 
                                   @"Some String Value 2", @"StringKey2", nil];

/* Pass the NSDictionary we created above. */
[NSTimer scheduledTimerWithTimeInterval:6 target:self 
                  selector:@selector(Pokeme:) userInfo:passTheseKeys repeats:NO];

/* Convert the timer object to NSDictionary and handle it in the usual way. */
- (void)Pokeme:(NSTimer*)timer {
    NSDictionary *passed = (NSDictionary *)[timer userInfo];
    NSString * objectString1 = [passed objectForKey:@"StringKey1"];
    NSString * objectString2 = [passed objectForKey:@"StringKey2"];
}
于 2012-05-03T00:05:28.940 回答