点击UITableViewCell中的手势,导致其他单元格改变状态

时间:2014-12-07 02:14:12

标签: ios objective-c iphone uitableview

我制作了我的第一个iOS应用程序,并且我有一个带有UITableViewCells列表的UITableView。每个UITableViewCells都有两个标签:

@property (weak, nonatomic) IBOutlet UILabel *upvote;
@property (weak, nonatomic) IBOutlet UILabel *downvote;

这些标签每个都有一个手势识别器。点击标签时,两个标签都通过动画将其alpha设置为0。

-(void) handleSingleTapGesture: (UITapGestureRecognizer *)gestureRecognizer
{
    UILabel *vote = (UILabel*)[gestureRecognizer view];
    AppCell *appCell = (AppCell*)vote.superview.superview;

    [UIView animateWithDuration: 1.0 animations:^(void) 
    {
        appCell.upvote.alpha = 0;
        appCell.downvote.alpha = 0;
    }
}

这是cellForRawAtIndexPath方法:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath 
{
    AppCell *cell = (AppCell *)[tableView dequeueReusableCellWithIdentifier:@"AppCell"];
    App *app (self.apps)[indexPath.row];

    /** setting the text/fonts/alpha for other labels I get from a HTTP POST request. Did not include the code since not relevant */

    UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)];

    cell.upvote.font = [UIFont fontWithName:@"Roboto-Light" size:14];
    [cell.upvote setUserInteractionEnabled:YES];
    [cell.upvote addGestureRecognizer:singleTapGestureRecognizer];

    *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)];

    cell.downvote.font = [UIFont fontWithName:@"Roboto-Light" size:14];
    [cell.downvote setUserInteractionEnabled:YES];
    [cell.downvote addGestureRecognizer:singleTapGestureRecognizer];

}

它可以正常工作。当我点击文本时,它们都消失了。但是,当我向下滚动一些未来的单元格时,似乎没有UPVOTE / DOWNVOTE文本。

我非常有信心它与细胞的重复使用有关,但我不知道如何解决它。

我找到了潜在的解决方案,但我似乎找不到多少。我唯一能找到的是,向UITableView而不是UITableViewCell添加手势识别器效率更高。我无法做到这一点,因为我不希望在点击单元格时发生操作,只有当两个标签中的一个被轻敲时才会发生。

如果需要更多信息/我在StackOverflow上错过了一个解决方案,请告诉我。

1 个答案:

答案 0 :(得分:1)

正如您所猜测的,它可能与细胞的重复使用有关。 cellForRowAtIndexPath方法中的注释表示它处理alpha,但方法中没有alpha设置,所以......

当一个单元格被重用时,upvotedownvote标签alpha就是它最后设置的内容,无论是隐式(创建UILabel时默认为1)还是显式(由手势处理程序设置为0。

您需要跟踪每个单元格的投票,并在cellForRowAtIndexPath方法中适当地设置alpha。