我正在使用最新的SDK和XCode 4.2开发iOS 4应用程序。
我有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;
}
}
}
...
}
当用户触摸该按钮时,如何知道哪个部分和行是单击的单元格?
答案 0 :(得分:6)
在按钮上放置一个标签。例如:
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);
您需要将选择器更改为@selector(addEventToiCal:)
并将方法更新为-(void) addEventToiCal:(UIButton *)sender
。
然后,您可以向-addEventToiCal:
if (!([sender isKindOfClass:[UIButton class]]))
return;
NSUInteger section = ((sender.tag >> 16) & 0xFFFF);
NSUInteger row = (sender.tag & 0xFFFF);
NSLog(@"Button in section %i on row %i was pressed.", section, row);
答案 1 :(得分:3)
将按钮的目标设置为单元格中的方法,而不是将目标设置为控制器本身,使用类似tappedButton:(UIButton *)button inCell:(UITableViewCell *)cell
的方法为单元格创建委托协议,并将控制器设置为单元格的委托。在target方法中调用该委托方法。
然后在控制器的委托方法实现中,您可以通过调用NSIndexPath
的{{1}}找到单元格的UITableView
。
答案 2 :(得分:2)
将标记值分配给按钮,如cellForRowAtIndexPath
方法
cell.addToCalendarButton.tag=indexPath.row
当您向按钮添加方法时,也会发送发件人,因此请将方法指定给按钮。
[cell.addToCalendarButton addTarget:self action:@selector(addEventToiCal :) forControlEvents:UIControlEventTouchUpInside];
在您的方法中,阅读相关的行
- (IBAction)addEventToiCal:(id)sender { NSLog(“当前行是%d”,[发送者标签]); }
如果您现在想了解该部分,那么indexPath会做这样的事情
- (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];
答案 3 :(得分:0)
BNRXIBCell是一个出色的解决方案。它是一个UITableViewCell子类,用于子类化,将动作消息从单元子视图转发到控制器。