我制作了我的第一个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上错过了一个解决方案,请告诉我。
答案 0 :(得分:1)
正如您所猜测的,它可能与细胞的重复使用有关。 cellForRowAtIndexPath
方法中的注释表示它处理alpha,但方法中没有alpha设置,所以......
当一个单元格被重用时,upvote
和downvote
标签alpha就是它最后设置的内容,无论是隐式(创建UILabel
时默认为1)还是显式(由手势处理程序设置为0。
您需要跟踪每个单元格的投票,并在cellForRowAtIndexPath
方法中适当地设置alpha。