2013-10-02 2 views
0

У меня проблемы с моей кнопкой, которая находится в стороне моего UITableViewCell. Я использую раскадровку и подключаю свою кнопку через IB. В моей cellforRowatIndexPath я добавил действие на мою кнопку:UIButton в Table View Cell вопрос

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 

Я не уверен, что я сделал неправильно

ответ

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]; 
    ... 
+0

Хорошо я попробуем это. Есть ли способ получить индексный путь для кнопки в моем методе userDidtap ..? –

+0

Вы берете 'button' и смотрите его' superiew' (и, возможно, супервизор супервизора), чтобы получить 'UITableViewCell', который его содержит. Тогда вам просто нужно '- [UITableView indexPathForCell:]'. –

+0

Теоретически вы можете использовать параметр 'UIEvent' из параметра' @selector (a: b:) 'вместе с' - [UITableView indexPathForRowAtPoint:] 'для получения указателя. '[tableView indexPathForRowAtPoint: [event.allTouches.anyObject locationInView: tableView]]' –

0

вы не можете добавить цель с более т han один параметр в селекторе UIButton. Когда вызывается селектор, принимайте только параметр отправителя, в этом случае объект UIButton. Поэтому я рекомендую вам использовать:

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

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

А затем получить фотографию, используя ярлык ячейки, например.

удачи;)

+0

Технически, вы можете иметь два параметра, а второй параметр является 'UIEvent' –

Смежные вопросы