Objective-C将tableView indexPath传递给另一个方法

时间:2016-01-15 14:43:00

标签: ios objective-c uitableview

我在这里有这个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?

4 个答案:

答案 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。如果表视图允许移动,插入或删除任何行,则会失败

这不是一个好的答案。*

由于ComparatorCheckBox,您可以在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

进行访问