表视图单元格问题中的UIButton

时间:2013-10-02 16:17:53

标签: ios objective-c uitableview

我的按钮位于UITableViewCell旁边,我遇到了问题。我正在使用故事板并通过IB连接我的按钮。在我的cellforRowatIndexPath中,我向我的按钮添加了一个动作:

cell.likeBtnPressed.tag = indexPath.row;
[cell.likeBtnPressed addTarget:self action:@selector(userDidTapOnLikeButton:photo:) forControlEvents:UIControlEventTouchUpInside];

下面您将看到按下按钮时的调用内容:

-(void)userDidTapOnLikeButton:(UIButton *)button photo:(PFObject *)photo{
    //Disable the button so users cannot send duplicat requests
    [button setEnabled:NO];
    [button setTintColor:[UIColor redColor]];


    //Set the new state of the button
    BOOL liked = !button.selected;
    [button setEnabled:liked];

    //Get the current number of likes the post have
    NSString *originalButtonTitle = button.titleLabel.text;
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];

    //Update the like count in the ECDCache
    NSNumber *likeCount = [numberFormatter numberFromString:button.titleLabel.text];
    if (liked) {
        likeCount = [NSNumber numberWithInt:[likeCount intValue] + 1];
        [[ECDCache sharedCache] incrementLikerCountForPhoto:photo];
    }else{
        if ([likeCount intValue] > 0) {
            likeCount = [NSNumber numberWithInt:[likeCount intValue] - 1];
        }

        [[ECDCache sharedCache] decrementLikerCountForPhoto:photo];
    }

    //Add the current user as a liker of the photo in ECDCache
    [[ECDCache sharedCache] setPhotoIsLikedByCurrentUser:photo liked:liked];

    //Update the button label
    [button setTitle:[numberFormatter stringFromNumber:likeCount] forState:UIControlStateNormal];

    //Call the appropriate static method to handle creating/deleting the right object
    if (liked) {
        [ECDUtility likePhotoInBackground:photo block:^(BOOL succeeded, NSError *error) {
            [button setEnabled:YES];
            [button setTitleEdgeInsets:UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0f)];
            [[button titleLabel] setShadowOffset:CGSizeMake(0.0f, -1.0f)];

            if (!succeeded) {
                // Revert the button title (the number) if the call fails
                [button setTitle:originalButtonTitle forState:UIControlStateNormal];
            }
        }];
    }
}

当我按下按钮时,我会收到:

-[UITouchesEvent objectId]: unrecognized selector sent to instance 0x15ee5de0

我不确定我做错了什么

2 个答案:

答案 0 :(得分:1)

问题是您的方法接收的第二个参数不是PFObject,而是UIEvent

您可以向addTarget:action:forControlEvents:发送三种类型的选择器:

  • @selector(a) :此方法不带参数。
  • @selector(a:) :此方法有一个参数,即接收控制事件的UIControl
  • @selector(a:b:) :此方法有两个参数,即收到控件事件的UIControl和触发它的UIEvent

由于您只想获得按钮,因此您应该有这样的签名:

-(void)userDidTapOnLikeButton:(UIButton *)button
{
    PFObject *photo = [self someLogicToGetThePhotoFromTheButton:button];
    ...

答案 1 :(得分:0)

您无法在UIButton选择器中添加具有多个参数的目标。当调用选择器时,只接收sender参数,在这种情况下,接收UIButton对象。所以我建议您使用:

[cell.likeBtnPressed addTarget:self action:@selector(userDidTapOnLikeButton:photo:) forControlEvents:UIControlEventTouchUpInside];

-(void)userDidTapOnLikeButton:(id)sender{
  //Your code
}

然后使用单元格的标签检索照片。

祝你好运;)