【问题标题】:NSTimer userInfo. How object is passing to the selector?NSTimer 用户信息。对象如何传递给选择器?
【发布时间】:2012-03-20 08:10:55
【问题描述】:

我有这个代码:

-(void)startRotation:(RDUtilitiesBarRotation)mode {
    rotationTimer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(rotateSelectedItem:) userInfo:[NSNumber numberWithInt:mode] repeats:YES];
}
-(void)rotateSelectedItem:(NSNumber*)sender {
    float currAngle = [selectedItem currentRotation];
    if ([sender intValue] == RDUtilitiesBarRotationLeft) {
        [selectedItem rotateImage:currAngle - 1];
    }
    else {
        [selectedItem rotateImage:currAngle + 1];
    }
}
-(void)stopRotation {
    [rotationTimer invalidate];
    rotationTimer = nil;
}

目标是在用户按住按钮时开始旋转视图。当用户释放它时,计时器将停止。

但我给了这个:

-[__NSCFTimer intValue]:无法识别的选择器发送到实例 0x4ae360

但如果我在 userInfo 中添加一个 NSNumber 类,为什么我会收到计时器?

谢谢。

【问题讨论】:

    标签: ios nstimer userinfo


    【解决方案1】:

    您误解了向计时器注册的选择器的签名。发件人是NSTimer*,而不是您传递给其构造函数的 userInfo 对象:

    -(void)rotateSelectedItem:(NSTimer*)sender
    {
        float currAngle = [selectedItem currentRotation];
        if ([sender.userInfo intValue] == RDUtilitiesBarRotationLeft)
        {
            [selectedItem rotateImage:currAngle - 1];
        }
        else
        {
            [selectedItem rotateImage:currAngle + 1];
        }
    }
    

    【讨论】:

      【解决方案2】:

      您的计时器操作方法应如下所示

      -(void)rotateSelectedItem:(NSTimer*)sender
      

      您可以通过以下方式获取用户信息

      NSNumber *userInfo = sender.userInfo;
      

      【讨论】:

        【解决方案3】:

        来自文档:

        定时器触发时发送给目标的消息。选择器必须 有以下签名:

        - (void)timerFireMethod:(NSTimer*)theTimer
        

        【讨论】:

          猜你喜欢
          • 2016-07-21
          • 1970-01-01
          • 2016-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-22
          • 2021-09-24
          • 2013-03-23
          • 2021-12-03
          相关资源
          最近更新 更多