Как найти indexPath for tapped accessory button в 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;
    }
}

4 ответов


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

но, когда он посылает вам prepareForSegue:sender: сообщении


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

+ (UITableViewCell *)findParentCellOfView:(UIView *)view {
  if (view == nil || [view isKindOfClass:[UITableViewCell class]]) {
    return (UITableViewCell *)view;
  }
  return [self findParentCellOfView:[view superview]];
}

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

/ / решение : - вы можете назначить тег кнопке просмотра аксессуаров в этом методе 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 строки, в которой вы щелкнули представление аксессуаров.


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

[self performSegueWithIdentifier: @"IdentifierNameHere" sender: self];