检测UITableViewCell是否是重用的单元格

时间:2015-02-18 14:43:37

标签: ios objective-c uitableview

在我的应用程序中,我有带多个按钮的UITableView单元格。每个细胞4个UIButton。对于每个UIButton,我想添加一个UILongPressGestureRecognizer。代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    FriendViewCell *cell = (FriendViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


    for(int i =0; i<4; i++) {




            UIButton *button = cell.buttons[i];
            UILabel *label = cell.labels[i];

            [button setTag:(int)indexPath.row*4+i];
            [button addTarget:self action:@selector(friendTapped:) forControlEvents:UIControlEventTouchUpInside];

            UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressFriend:)];

            [button addGestureRecognizer:longPress];

}

}

我刚刚意识到如果一个单元格被重用,那么我每个按钮会多次添加一个手势。有没有办法检测创建的​​单元格是重用还是新建?我不认为我可以将代码移动到FriendViewCell类,因为我的手势目标friendTapped:在我的UITableViewController中。任何指针将不胜感激!感谢

3 个答案:

答案 0 :(得分:1)

更简洁的方法是为Button创建自定义类。这个类在初始化时会创建一个UILongPressGestureRecognizer,在触发手势时会调用一个委托(你的控制器)。

<强>·H

@class MyLongPressedButton
@protocol MyLongPressedButtonDelegate
- (void)buttonIsLongPressed:(MyLongPressedButton *)button;
@end

@interface MyLongPressedButton
@property (nonatomic, weak) id<MyLongPressedButtonDelegate > delegate
@end

<强>的.m

-(id)init {
   if (self = [super init]) {
     UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
     [self addGestureRecognizer:longPress];

   }
   return self;
}

-(void)longPress:(id)sender {
   [_delegate buttonIsLongPressed:self]
}

答案 1 :(得分:0)

我建议将代码放在单元格中,并创建一个委托方法,该方法将返回对单元格的引用。

E.g。

@protocol myAwesomebuttonCellDelegate <NSObject>

 - (void)myAwesomeCell:(MyAwesomeCell *)cell buttonPressed:(UIButton *)btn;

@end

然后在您的视图控制器中,您可以使用:

NSIndexPath *index = [tblView indexPathForCell:cell];

获取行/部分

答案 2 :(得分:0)

首先,有很多方法可以解决这个问题 - 您可以检查按钮上现有的手势识别器是否有长按手势识别器。

稍微好一点的解决方案是在单元格上定义属性,例如

@property (nonatomic, assign) BOOL recognizerAdded

但是,最好的解决方案是在单元格类中执行此操作

@implementation FriendViewCell

- (void)awakeFromNib {
   //add the recognizers
}

@end

请注意,您的表委托不应该关心单元格的结构,单元格负责正确设置自己。

当然,您需要在单元格上委托代理人来通知您有关该操作的信息,但这将是一个更清洁的解决方案。