如何在 iOS TableView 中的每行创建多个点击处理程序?
How do I make multiple tap handlers per row in an iOS TableView?
我在 table 视图中有一个企业列表,其中有几个可点击区域。第一个是在单独的 ViewController 上查看商家详细信息的区域,第二个是 phone 商家,第三个是在地图上定位商家。
我是 iOS 的新手,所以我不确定执行此操作的最佳方法。
在 Android 中,这相当容易。我可以在 table 适配器的 getView() 方法中做这样的事情:
linearLayoutBusiness.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(context, DetailsActivity.class);
i.putExtra("business", business);
context.startActivity(i);
}
});
到目前为止,我在 cellForRowAtIndexPath 方法中得到的是:
//business details tap handler
UITapGestureRecognizer *touchOnBusinessDetails = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(detailsTapHandler)];
[cell.BusinessInfoView addGestureRecognizer:touchOnBusinessDetails];
//call view tap handler
UITapGestureRecognizer *touchOnCallView = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(callViewTapHandler)];
[cell.callView addGestureRecognizer:touchOnCallView];
//location view tap handler
UITapGestureRecognizer *touchOnLocationView = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(locationViewTapHandler)];
[cell.locationView addGestureRecognizer:touchOnLocationView];
return cell;
}
- (void)detailsTapHandler{
NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
NSInteger row = selectedIndexPath.row;
BusinessEntity *businessTapped = businesses[row];
//open details view
[self performSegueWithIdentifier:@"detailsSegue" sender:self];
NSLog(@"detailsView");
}
- (void)callViewTapHandler{
NSLog(@"callView");
}
- (void)locationViewTapHandler{
NSLog(@"locationView");
}
我遇到的问题 运行 是 selectedIndexPath 始终为 nil,我无法在 detailsTapHandler 方法中发送与所选行对应的业务对象。
我走在正确的轨道上吗?或者有更好的方法吗?
您的选择器应如下所示:
- (void)locationViewTapHandler:(UIGestureRecognizer*)sender
{
NSLog(@"locationView");
}
So when selector gets triggered, it is passed gesture recognizer as an argument.然后您可以使用 sender.view
属性 访问附加到手势识别器的视图。
了解视图,您可以向上爬视图层次结构以获取包含它的 UITableViewCell
,然后调用 [tableView indexPathForCell:cell]
,或者只将模型索引存储在视图的 tag
中属性 并直接通过索引访问模型。
我在 table 视图中有一个企业列表,其中有几个可点击区域。第一个是在单独的 ViewController 上查看商家详细信息的区域,第二个是 phone 商家,第三个是在地图上定位商家。
我是 iOS 的新手,所以我不确定执行此操作的最佳方法。
在 Android 中,这相当容易。我可以在 table 适配器的 getView() 方法中做这样的事情:
linearLayoutBusiness.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(context, DetailsActivity.class);
i.putExtra("business", business);
context.startActivity(i);
}
});
到目前为止,我在 cellForRowAtIndexPath 方法中得到的是:
//business details tap handler
UITapGestureRecognizer *touchOnBusinessDetails = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(detailsTapHandler)];
[cell.BusinessInfoView addGestureRecognizer:touchOnBusinessDetails];
//call view tap handler
UITapGestureRecognizer *touchOnCallView = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(callViewTapHandler)];
[cell.callView addGestureRecognizer:touchOnCallView];
//location view tap handler
UITapGestureRecognizer *touchOnLocationView = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(locationViewTapHandler)];
[cell.locationView addGestureRecognizer:touchOnLocationView];
return cell;
}
- (void)detailsTapHandler{
NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
NSInteger row = selectedIndexPath.row;
BusinessEntity *businessTapped = businesses[row];
//open details view
[self performSegueWithIdentifier:@"detailsSegue" sender:self];
NSLog(@"detailsView");
}
- (void)callViewTapHandler{
NSLog(@"callView");
}
- (void)locationViewTapHandler{
NSLog(@"locationView");
}
我遇到的问题 运行 是 selectedIndexPath 始终为 nil,我无法在 detailsTapHandler 方法中发送与所选行对应的业务对象。
我走在正确的轨道上吗?或者有更好的方法吗?
您的选择器应如下所示:
- (void)locationViewTapHandler:(UIGestureRecognizer*)sender
{
NSLog(@"locationView");
}
So when selector gets triggered, it is passed gesture recognizer as an argument.然后您可以使用 sender.view
属性 访问附加到手势识别器的视图。
了解视图,您可以向上爬视图层次结构以获取包含它的 UITableViewCell
,然后调用 [tableView indexPathForCell:cell]
,或者只将模型索引存储在视图的 tag
中属性 并直接通过索引访问模型。