PrepareForSegue получает вызов дважды, с попыткой представить <UINavigationController> во время презентации

Я новичок в программировании на ios и спрашиваю здесь, но я посещаю все время! Я сфокусирован на том, почему я получаю эту проблему, она компилируется без ошибок, и я проверил и проверил все свои выходные данные и идентификаторы в своей MainStoryboard.

У меня есть 2 UITableViewControllers, я передаю строку от первой до второй, когда пользователь выбирает элемент в таблице, поэтому в FirstTableViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    int sel = indexPath.row;
    if (sel == 0) {
        _keyName = [NSString stringWithString:_string1];
        NSLog(@"the table was selected at cell 0, %@", _string1);
    }
    if (sel == 1) {
        _keyName = [NSString stringWithString:_string2];
    }
    // more code below...
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"ResultsSegue"])
    {
        UINavigationController *navigationController = segue.destinationViewController;
        ResultsViewController *rv = [[navigationController viewControllers] objectAtIndex:0];
        [rv setResults: _keyName];
        NSLog(@"in the progress view, %@", _keyName);
        //rv.delegate = (id)self;
        rv.delegate = self;            
    }
}

И в моем ResultsViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"in the results, %@", _results);
    NSLog(@"in the results view");
}

В показании NSlog я получаю: ... в представлении прогресса (null) в результатах, (null) в представлении прогресса "Правая строка" Предупреждение: попытка представить

Затем, когда я нажимаю кнопку отмены, чтобы вернуться в firstTableview и снова нажать подробное представление, оно больше не показывает нуль.

в представлении прогресса, правая строка в результатах, правая строка в представлении прогресса, правая строка

Ответ 1

Проблема заключается в том, что prepareForSegue вызывается до didSelectRowAtIndexPath. Вам следует просто исключить метод didSelectRowAtIndexPath и сделать все в prepareForSegue. Вы можете использовать следующую строку, чтобы получить требуемый индекс:

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

Ответ 2

Ответ Роба помог мне, а также - спасибо! Я кодирую в Swift, поэтому для тех, кто сталкивается с этим во время Swifting, вот как получить индекс (или строку индекса), нажав на Swift 3:

var rowClicked = (self.tableView.indexPathForSelectedRow?.row)!