在我的应用程序中,我有带多个按钮的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中。任何指针将不胜感激!感谢
答案 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
请注意,您的表委托不应该关心单元格的结构,单元格负责正确设置自己。
当然,您需要在单元格上委托代理人来通知您有关该操作的信息,但这将是一个更清洁的解决方案。