Ios 自定义UITableViewCell和UIButton:单击了哪个按钮?
我正在用最新的SDK和XCode 4.2开发一个iOS 4应用程序 我有一个带节的Ios 自定义UITableViewCell和UIButton:单击了哪个按钮?,ios,uitableview,uibutton,Ios,Uitableview,Uibutton,我正在用最新的SDK和XCode 4.2开发一个iOS 4应用程序 我有一个带节的UITableView和自定义的UITableViewCell。每个单元格都有一个UIButton,所有这些按钮都有相同的UIControlEventTouchUpInside目标 这是我的代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { s
UITableView
和自定义的UITableViewCell
。每个单元格都有一个UIButton,所有这些按钮都有相同的UIControlEventTouchUpInside
目标
这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* cellIdentifier = @"CalendarCell";
CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil];
for(id currentObject in topLevelObjects)
{
if ([currentObject isKindOfClass:[CalendarEventCell class]])
{
cell = (CalendarEventCell *)currentObject;
[cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside];
break;
}
}
}
...
}
当用户触摸该按钮内部时,我如何知道单击的单元格位于哪个区域和行?在按钮上放置一个标记。例如:
CalendarEventCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CalendarEventCell" owner:nil options:nil];
for(id currentObject in topLevelObjects)
{
if ([currentObject isKindOfClass:[CalendarEventCell class]])
{
cell = (CalendarEventCell *)currentObject;
[cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal) forControlEvents:UIControlEventTouchUpInside];
break;
}
}
}
cell.addToCalendarButton.tag = ((indexPath.section & 0xFFFF) << 16) |
(indexPath.row & 0xFFFF);
将button的目标设置为单元格中的方法,而不是将目标设置为控制器本身,使用类似于
tappedButton:(UIButton*)button inCell:(UITableViewCell*)单元格的方法为单元格创建委派协议,并将控制器设置为单元格的委派。在目标方法中,调用该委托方法
然后,在控制器的委托方法实现中,您可以通过调用UITableView
的tableView:indexPathForCell:
将标签值分配给按钮,就像在cellforrowatinexpath
方法中一样
cell.addToCalendarButton.tag=indexPath.row
当您将方法添加到按钮时,也会发送发送者,所以像这样将方法分配给按钮
[cell.addToCalendarButton addTarget:自我操作:@selector(AddEventToCale:)for ControlEvents:UIControlEventTouchUpInside]
在您的方法中,像这样读取相关行
-(iAction)附加说明:(id)发送方{
NSLog(“当前行为%d”,[sender tag]);
}
如果你现在想了解这一部分,那么就做这样的事情吧
- (void)addEventToiCal:(id)sender event:(id)event
{
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];
NsLog("value of indePath.section %d ,indexPath.row %d",indexPath.section,indexPath.row);
}
在cellforRowAtIndexPath上指定方法,如下所示
[cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal:event:)forControlEvents:UIControlEventTouchUpInside];
是一个优秀的解决方案,适用于iOS 5及以上版本。它是一个UITableViewCell子类,旨在子类化,用于将操作消息从单元格子视图转发到控制器。您可以为该按钮设置标记。通过使用该标记号,您可以找出单击了哪个按钮。请看这里:您还可以将该方法声明为-(void)addeventtical:(UIButton*)sender
,然后删除第一行。@Jack先生,我讨论过这样写的问题。因为你似乎支持这个想法,我更新了答案以反映你的建议。谢谢你的回答。我需要indexPath.section和indexPath.row.Tagging方法很简单,但伸缩性不太好,特别是在向单元格中添加更多控件时,这些控件必须在控制器中标识,并且在添加和删除行后需要更新标记。我已经多次看到它导致错误/问题。@VansFannel您可以使用以下内容对节和行进行编码:tag=((indexPath.section&0xFFFF)>16)&0xFFFF);行=(标记&0xFFFF)代码>谢谢你的回答。我需要indexPath.section和indexPath.row。将section和row传递给tappedButton:
方法比调用tableView:indexPathForCell:
更容易,不是吗?然后您必须将单元格的NSIndexPath
作为其ivar/属性—这也是可能的。但您不必要地复制了您必须另外维护的数据—在单元格死亡时释放数据,在添加或删除上述单元格时更新数据,等等。但是,如果您通过运行tableView:indexPathForCell:
遇到性能问题,这是不可能的,您当然可以使用该“快捷方式”。
[cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal:event:)forControlEvents:UIControlEventTouchUpInside];