Индикатор подробного раскрытия информации / prepareForSegue

Прошло много времени с тех пор, как я занимался программированием для iOS, поэтому, пожалуйста, простите меня за простой вопрос. Я искал, и, возможно, я просто над этим подумал.

У меня есть сегмент под названием ShowStreamDetails, соединяющий ячейки динамического прототипа с подробным представлением, которое показывает ... детали выбранной ячейки. Теперь я не знал, что кнопки раскрытия подробностей будут неудобными. Если я выберу ячейку, она будет работать правильно и передать объекты в подробное представление. Если я нажму на индикатор раскрытия подробностей, он перейдет в подробное представление, и это представление затем отобразит первый элемент в списке, а не фактический элемент, указанный в ячейке. Итак, вот что у меня есть.

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:   
(NSIndexPath *)indexPath
{
  [self performSegueWithIdentifier:@"ShowStreamDetails" sender:[self.tableView cellForRowAtIndexPath:indexPath]];
}

и подготовка к переходу:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([[segue identifier] isEqualToString:@"ShowStreamDetails"]) 
    {
        StreamsDetailViewController *detailViewController = [segue destinationViewController];

        detailViewController.streams = [self.dataController objectInListAtIndex:[self.tableView indexPathForSelectedRow].row];
    }
}

Как мне добавить это в prepareForSegue: чтобы он передавал правильную информацию?


person Shawn Henderson    schedule 14.08.2012    source источник


Ответы (3)


Я только что столкнулся с этой проблемой и смог выяснить, что параметр отправителя - это ячейка UITableView для раскрытия подробностей.

Так что просто сделайте что-нибудь вроде этого:

UITableViewCell* cell = (UITableViewCell*)sender;
IndexPath* iPath = [self.tableView indexPathForCell: cell];
person voidref    schedule 02.04.2013

У @voidref правильная идея.

Проблема в том, что когда пользователь нажимает кнопку раскрытия подробностей, ячейка не выбирается. Таким образом, -indexPathForSelectedRow возвращает nil, который рассматривается как ноль для индекса массива.

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{
    if ([[segue identifier] isEqualToString:@"ShowStreamDetails"]) 
    {
        StreamsDetailViewController *detailViewController = [segue destinationViewController];

        detailViewController.streams = [self.dataController objectInListAtIndex:[self.tableView indexPathForCell:sender].row];
    }
}

Кроме того, это не связано напрямую с вашим исходным вопросом, но вам не нужно реализовывать -tableView:accessoryButtonTappedForRowWithIndexPath:. Вместо этого просто установите тип аксессуара ячейки-прототипа на «Подробное раскрытие» в раскадровке и управляйте / двумя пальцами / перетащите правой кнопкой мыши от кнопки аксессуара в ячейке-прототипе к контроллеру подробного представления, а затем назовите полученный сегмент «ShowStreamDetails».

Несмотря на то, что вспомогательная кнопка, возможно, является «отправителем», параметр sender будет автоматически установлен в ячейку табличного представления.

person Frank Schmitt    schedule 12.11.2014

Версия в Swift:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let shooterController = segue.destination as? UIShooterViewController {
        if let cell = sender as? UITableViewCell, let indexPath = tableView.indexPath(for: cell) {
            let matchShooter = fetchedResultsController.object(at: indexPath)
            shooterController.setEntity(matchShooter.shooter, new: false)
        }
    }
}

Отправитель содержит ячейку, в которой был нажат индикатор раскрытия.

person Dan    schedule 03.01.2018