2012-03-01 7 views
6

Tôi có mã này:NSTimer userInfo. Làm thế nào đối tượng được truyền cho bộ chọn?

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

Mục tiêu là bắt đầu xoay chế độ xem trong khi người dùng giữ nút. Khi người dùng phát hành, bộ hẹn giờ sẽ dừng.

Nhưng tôi cho điều này:

- [__ NSCFTimer intValue]: chọn không được công nhận gửi đến dụ 0x4ae360

Nhưng nếu tôi paasing trong UserInfo một lớp NSNumber, tại sao tôi m nhận hẹn giờ?

Cảm ơn.

Trả lời

25

phương pháp hành động hẹn giờ của bạn sẽ trông như thế này

-(void)rotateSelectedItem:(NSTimer*)sender 

Bạn có thể nhận tại UserInfo bằng cách làm

NSNumber *userInfo = sender.userInfo; 
2

Bạn hiểu nhầm chữ ký của bộ chọn mà bạn đăng ký bằng bộ hẹn giờ. Người gửi là NSTimer*, không phải là đối tượng UserInfo mà bạn vượt qua vào constructor của nó:

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

Từ tài liệu:

Tin nhắn gửi đến đích khi bộ đếm thời gian kích hoạt. Bộ chọn phải có chữ ký sau:

- (void)timerFireMethod:(NSTimer*)theTimer