我在这里有这个cellForRowAtIndexPath方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
if (cell.accessoryView == nil) {
cell.accessoryView = [[Checkbox alloc] initWithFrame:CGRectMake(0, 0, 25, 43)];
cell.accessoryView.opaque = NO;
cell.backgroundColor = [UIColor clearColor];
[(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:) forControlEvents:UIControlEventValueChanged];
}
NSString *sectionTitle = [contactSectionTitles objectAtIndex:indexPath.section];
NSArray *sectionContacts = [contactDirectoryFinal objectForKey:sectionTitle];
NSString *contacts = [[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"item"];
cell.textLabel.text = contacts;
[(Checkbox*)cell.accessoryView setChecked: [[[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"checkedItem"] boolValue] ];
return cell;
}
在这个方法中,我有这一行:
[(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:) forControlEvents:UIControlEventValueChanged];
调用此方法
- (IBAction)checkBoxTapped:(id)sender forEvent:(UIEvent*)event
{
}
我要做的是调整调用此方法的方式,所以我也传递了indexPath.row数字
我开始这样做了:
[(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:rowNumber:) forControlEvents:UIControlEventValueChanged];
和这个
- (IBAction)checkBoxTapped:(id)sender forEvent:(UIEvent*)event rowNumber:(int)row
{
}
但我是选择者的新手,我的问题是我在哪里传递rowNumber?
答案 0 :(得分:1)
如您所知,您无法通过选择器传递任何值,只传递发件人和事件。这就是为什么你需要另一种方式传递行号。
一种方法是在控件上使用tag属性并使用[sender tag]
检索它,但是如果在没有调用cellForRowAtIndexPath的情况下更改表索引,则此方法将失败。它也不适用于分段表视图。
更强大的方法是使用视图的位置来计算正确的行。 UITableView有一个方便的方法:
- (IBAction)checkBoxTapped:(id)sender forEvent:(UIEvent*)event {
CGPoint checkBoxPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:checkBoxPosition];
}
答案 1 :(得分:0)
作为传递它的替代方法....
func checkBoxTapped(sender: CheckBox, withEvent event: UIEvent) {
if let tap = event.allTouches()?.first {
let location = tap.locationInView(tableView)
let indexPath = tableView.indexPathForRowAtPoint(location)
..... do something
}
}
答案 2 :(得分:0)
<强> *更新强>
作为@Maddy的评论
不要使用tag来表示indexPath。如果表视图允许移动,插入或删除任何行,则会失败
这不是一个好的答案。*
由于Comparator
是CheckBox
,您可以在UIView
中设置其标记,然后在cellForRowAtIndexPath:
checkBoxTapped:
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
if (cell.accessoryView == nil) {
cell.accessoryView = [[Checkbox alloc] initWithFrame:CGRectMake(0, 0, 25, 43)];
cell.accessoryView.opaque = NO;
cell.backgroundColor = [UIColor clearColor];
[(Checkbox*)cell.accessoryView addTarget:self action:@selector(checkBoxTapped:forEvent:) forControlEvents:UIControlEventValueChanged];
}
NSString *sectionTitle = [contactSectionTitles objectAtIndex:indexPath.section];
NSArray *sectionContacts = [contactDirectoryFinal objectForKey:sectionTitle];
NSString *contacts = [[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"item"];
cell.textLabel.text = contacts;
[(Checkbox*)cell.accessoryView setChecked: [[[sectionContacts objectAtIndex:indexPath.row] valueForKey:@"checkedItem"] boolValue] ];
// set the index to the tag.
cell.accessoryView.tag = indexPath.row
return cell;
答案 3 :(得分:0)
您可以使用:
- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell
一旦您拥有UITableViewCell
对象,可以将其作为sender.superview