我正在创建一个基于表视图的应用程序。我为表创建了一个自定义表格单元格,其中包含2个标签,1个图像和1个按钮。表视图数据源方法正常工作。我正在为自定义单元格和视图控制器类使用xib,我将委托和数据源连接到文件的所有者。但问题是当我选择表格行时,didSelectRowAtIndexPath没有起火。如上所述,解雇它的唯一方法是按住电池约3-4秒。有谁知道为什么会这样?
感谢您的任何指示...
这是我的表格视图方法..
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [finalAddonsArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
NewCustomCell *cell = (NewCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NewCustomCell" owner:self options:nil];
cell=[nib objectAtIndex:0];
}
Addons *addons1=[[Addons alloc]init];
addons1= [finalAddonsArray objectAtIndex:indexPath.row];
if (addons1.data == nil) {
cell.ivCategory.image = [UIImage imageNamed:@"blogo.jpg"];
}
else
{
cell.ivCategory.image=[UIImage imageWithData:addons1.data];
}
cell.lblTitle.text = addons1.name;
if (addons1.price == nil) {
cell.lblPrice.text = nil;
}
else{
cell.lblPrice.text = [NSString stringWithFormat:@"%@ rs",addons1.price];
}
[cell.button addTarget:self
action:@selector(editButtonPressed:)
forControlEvents:UIControlEventTouchUpInside];
cell.button.tag=indexPath.row;
index = indexPath;
cell.selectionStyle = UITableViewCellSelectionStyleGray;
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"sjcjksbcjksbcfkebscf1234567890");
}
我得到的另一件事是,如果我使用默认的UITableViewCell而不是自定义单元格,那么我的问题也是一样的,委托方法不会起火。
自定义单元格属性:
答案 0 :(得分:93)
同样的问题发生在我身上,因为我在其上添加了一个轻拍手势识别器。 如果您使用过任何手势识别器,请尝试将其删除并检查是否会导致问题。
编辑:阿里评论的解决方案: 如果您使用了点按手势,则可以使用[tap setCancelsTouchesInView:NO];
答案 1 :(得分:2)
我遇到了类似的问题:
对我来说,问题是因为我的UITableView
已添加到UIScrollView
,更具体地说是添加到contentView
。
似乎在contentView
内部,我必须按住2-3秒才能触发didSelectRowAtIndexPath
方法。
我将TableView移至self.view
而不是contentView
,它解决了问题!
答案 2 :(得分:2)
也许你会调用方法
[tableView deselectRowAtIndexPath:indexPath animated:NO];
。像
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// 1. manual call this method to deSelect Other Cell
[tableView deselectRowAtIndexPath:indexPath animated:NO];
// 2. than do other operation
PushViewController Or Some Animation ....
}
这解决了我的问题。
答案 3 :(得分:0)
如果你面临同样的问题,必须有一个 1. UITapGestureRecognizer为您创造问题 要么 2.滚动视图,您可以在其中放置表格视图。
因此,您应该删除手势或放置表格视图的超级滚动视图
答案 4 :(得分:0)
如果您的视图中有自定义手势对象,请检查override func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool
代理。将自定义手势与发件人手势进行比较,如果不是自定义手势对象,则将其传递给超级手势。因此系统手势/点击不会被阻止。
答案 5 :(得分:0)
正如其他人所建议的那样,[tap setCancelsTouchesInView:NO];
可以解决问题。
但是,我想澄清一件事:
如果您认为自己没有实现手势,并且对为什么必须将视图添加到受保护的视图中感到好奇,请检出类,因为您很可能继承了某个类,并且该类在其中包含敲击手势识别器。
就我而言,我执行了以下操作:
- (NSMutableArray *)tapProtectedViews
{
NSMutableArray *views = [super tapProtectedViews];
[views addObject:self.mTableView];
return views;
}
答案 6 :(得分:-2)
我不确定这一点,但Delays Content Touches
可能与此有关。