在UITableView中获取所选附件按钮的IndexPath

时间:2012-11-22 17:15:32

标签: indexing segue uitableview

UItableViewCell配件按钮出现问题。 我的配件按钮与另一个UIViewController的segue“连接”。 当我点击一个附件按钮时,我从模型中获取对象,并将此对象“传递”到segue destinationViewController。 这是我对segue方法的准备:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"IdentityCard"])
    {
        NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row);
        [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.tableView.indexPathForSelectedRow.row]];
    }
}

问题是方法开头的NSLog(在“if”之后)始终显示数字0! 我试图实现这个方法:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

但是在此方法之前执行了segue方法的准备,因此我无法为“保存”indexPath设置任何@property。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:20)

在:

- (void)prepareForSegue:(UIStoryboardSegue *)segue发件人:(id)发件人

...您有'sender'参数,可以让您知道已经过Tap的配件的Cell,所以:

index = [self.tableView indexPathForCell:sender] .row;

您可以获取它的索引以便使用它。

然后你不需要使用tableView的accessoryButtonTappedForRowWithIndexPath方法。

答案 1 :(得分:1)

我以这种方式修复问题: 我将UIViewController连接到destinationViewController(不是来自UIViewController的附件按钮)。

我在第一个View Controller中创建了一个@property:

@property (nonatomic) NSInteger indexPathRow;

然后我修改了这样的代码:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Disclosure Tapped----> %i" ,indexPath.row);
    self.indexPathRow = indexPath.row;
    [self performSegueWithIdentifier:@"IdentityCard" sender:self];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"IdentityCard"])
    {
        NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row);
        [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.indexPathRow]];
    }
}

现在有效!

答案 2 :(得分:0)

@Andres的解决方案对我有用但是如果我想将Add按钮添加到导航栏并且我想要显示具有相同segue标识符的相同viewcontroller,那么index = [self.tableView indexPathForCell:sender].row;代码不起作用,因为发送者不是UITableViewCell的子类。 所以这是我使用@Andres代码的解决方案:

- (void) addItem: (id) sender {
    [self performSegueWithIdentifier: @"Identifier" sender: self];
}

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender {
    id selectedObject;
    if (![[sender class] isSubclassOfClass: [UITableViewCell class]]) {
        // create a new object
        selectedObject = [...];
    }
    else {
        selectedObject = [objectArray objectAtIndex: [self.tableView indexPathForCell: sender].row];
    }

    if ([[segue identifier] isEqualToString: @"Identifier"]) {
        // use the new or existing object
        [selectedObject doSonething];
    }
}