Подтвердить что ты не робот

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

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

Я использовал метод delegate 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;
    }
}
4b9b3361

Ответ 1

Как вы обнаружили, система отправляет вам сообщение 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;
}

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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