Как найти indexPath для нажатой кнопки аксессуара в tableView

У меня простой UITableView с одним разделом и несколькими строками. Когда пользователь нажимает кнопку аксессуара ячейки (которая связана с detailsSegue. Я хочу знать, какая это была строка ячейки. Чтобы я мог выбрать правильный объект из моего массива и назначить его переменной из следующего представления.

Я использовал метод делегата tableview:accessoryButtonTappedForRowWithIndexPath: и присвоил значение indexPath моему частному свойству myRow. Чем в методе prepareForSegue:sender: я использовал свое значение self.myRow.row для выбора правильного объекта из массива.

Моя проблема в том, что эти два метода выполняются в неправильном порядке. Из NSLog я вижу, что метод prepareForSegue:sender: выполняется первым, а мой метод делегата изменяет значение self.myRow после него.

Таким образом, метод prepareForSegue:sender: всегда передает неправильный объект в следующий вид (тот, который был выбран ранее).

Извините за моих английских парней. Спасибо за помощь заранее.

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
    self.myRow = indexPath;
    NSLog(@"tapped button at row: %i",self.myRow.row); 
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"addSegue"]) {
        AddViewController *avc = segue.destinationViewController;
        avc.delegate = self;
    }
    else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
        NSLog(@"Segue row: %i",self.myRow.row);
        Annotation *annotation = [self.viewsList objectAtIndex:self.myRow.row];
        NSLog(@"Segue annotation object: %@",annotation.title);
        DetailsViewController *dvc = segue.destinationViewController;
        dvc.wikiKey = annotation.title;
    }
}

person Guferos    schedule 03.12.2012    source источник


Ответы (4)


Как вы заметили, система отправляет вам сообщение prepareForSegue:sender: до сообщения tableview:accessoryButtonTappedForRowWithIndexPath:.

Но когда он отправляет вам сообщение prepareForSegue:sender:, аргумент sender является аргументом UITableViewCell, содержащим дополнительное представление. Вы можете использовать это, чтобы определить, какая вспомогательная кнопка строки была нажата:

else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Annotation *annotation = [self.viewsList objectAtIndex:indexPath.row];
    DetailsViewController *dvc = segue.destinationViewController;
    dvc.wikiKey = annotation.title;
}
person rob mayoff    schedule 03.12.2012

Отправителем будет вспомогательная кнопка, верно? В этом случае вы сможете найти содержащую ее ячейку, пройдя через суперпредставления, а затем получить индексный путь этой ячейки. Я использовал подобный метод раньше, чтобы сделать первую часть:

+ (UITableViewCell *)findParentCellOfView:(UIView *)view {
  if (view == nil || [view isKindOfClass:[UITableViewCell class]]) {
    return (UITableViewCell *)view;
  }
  return [self findParentCellOfView:[view superview]];
}
person zem    schedule 03.12.2012
comment
Отправителем на самом деле является ячейка, а не дополнительная кнопка. - person rob mayoff; 03.12.2012

// Я предлагаю вам простой и лучший и легкий вариант: -

// Решение. В этом методе tableView можно присвоить тег кнопке вспомогательного вида.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // set accessory view
    UIButton *oValidHomeAccessryBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    // set target of accessory view button
    [oValidHomeAccessryBtn addTarget:self action:@selector(AccessoryAction:) forControlEvents:UIControlEventTouchUpInside];

    // set tag of accessory view button to the row of table
    oValidHomeAccessryBtn.tag =indexPath.row;

    // set button to accessory view
    cell.accessoryView = oValidHomeAccessryBtn ;
}

// Сделайте метод, который вы передали в селекторе, и получите значение тега, и вы получите indexPath дополнительного вида, нажатого

- (void)AccessoryAction:(id)sender
{
    NSLog(@"%d",[sender tag]);
}

Это самый простой способ получить indexPat строки, в которой вы щелкнули дополнительное представление.

person Ashish    schedule 11.10.2013

Что вам нужно сделать, так это вызвать segue программно из метода делегата. Предполагая, что вы используете раскадровки, вам нужно отключить segue в раскадровке и использовать метод делегата:

[self performSegueWithIdentifier: @"IdentifierNameHere" sender: self];
person Adam Johnson    schedule 03.12.2012