Проблема во время выполнения: вложенная анимация push при использовании PerformSegueWithIdentifier

У меня есть NavigationController, в котором есть TableView. Ячейка в телевизоре имеет «модальный» переход, который указывает на TableViewController (класс: Details.h/.m). Когда я выбираю ячейку, я попадаю в TableViewController, как и ожидалось.

Однако мне нужно добавить следующие функции:

1) нажмите на пункт назначения, чтобы я получил красивую кнопку возврата.
2) передайте различную информацию об объекте в выбранной ячейке в пункт назначения TVC.

Для этого я решаю следующие задачи:

1) Измените переход на "push" и присвойте ему идентификатор "segueToDetails"
2.1) добавьте код в метод didSelectRowAtIndexPath (ниже)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"segueToDetails" sender:self];
}

2.2) добавьте код в метод prepareForSegue (ниже)

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
    NSInteger rowNumber = selectedIndexPath.row;

    myObject = (MyObject *) [myArray objectAtIndex:rowNumber];

    Details *details = [segue destinationViewController];
    details.detailsObject = myObject;
}

2.3), чтобы подтвердить, что информация об объекте передается получателю, я вывожу некоторые данные с помощью NSLog (ниже)

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"name: %@", detailsObject.name);
}

Теперь, когда я запускаю проект и выбираю ячейку в таблице, я попадаю в целевой TVC, я вижу вывод из NSLog, что хорошо. У меня также есть хорошая кнопка назад. Но подождите, когда я нажимаю «Назад», у меня есть еще одна кнопка «Назад»! Нажав эту кнопку «Назад», я вернусь туда, откуда я изначально пришел. Окно отладчика показывает это сообщение каждый раз, когда я перехожу к целевому TVC.

2012-01-24 13:55:58.240 MyApp[26875:11603] nested push animation can result in corrupted navigation bar
012-01-24 13:55:58.593 MyApp[26875:11603] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
2012-01-24 13:55:58.593 MyApp[26875:11603] Unbalanced calls to begin/end appearance transitions for <SpotDetails: 0x7a7a370>.

Любые предложения о том, как решить эту проблему?

PS — я использую Xcode 4.2 с ARC, iOS 5


person ElasticThoughts    schedule 24.01.2012    source источник


Ответы (6)


Если у вас есть модальный переход в раскадровке, вам не нужен код в didSelectRowAtIndexPath:. Раскадровка сделает все остальное. Если вы попытаетесь сделать переход вручную, а также использовать его в раскадровке, у вас возникнут проблемы.

person Rob    schedule 24.01.2012
comment
Хорошо, я думаю, что знаю, что вы сейчас говорите. Вы хотите выглядеть как модальный переход, но иметь кнопку «Назад», как нажатие. У вас не может быть перехода раскадровки и ручного перехода для одного и того же представления одновременно. Вы заставляете навигацию использовать один и тот же объект контроллера представления дважды одновременно. Вам нужно удалить код из кода didSelectRowAtIndexPath. Затем вы можете справиться с остальным одним из двух способов. Если вы хотите модальный вид, поместите пользовательскую кнопку в левой части панели навигации. Или, если вы согласны с переходом push, измените переход раскадровки на тип push. - person Rob; 25.01.2012
comment
Роб, ты понял, поведение, которое ты описываешь (дважды одновременно), именно то, что происходило. У меня есть рабочий код, я опубликую его сегодня вечером. Спасибо! - person ElasticThoughts; 25.01.2012

Вы нажимаете представление дважды; один раз в раскадровке и один раз в didSelectRowAtIndexPath. Когда вы подключаете переход в раскадровке, не связывайте его с ячейкой таблицы напрямую, а скорее с контроллером представления, чтобы вы могли выполнять переход программно, а не раскадровка, делающая это за вас, когда вы нажимаете ячейку.

person Sepui    schedule 25.01.2012
comment
+1000. не связывайте его с ячейкой таблицы напрямую, а скорее с контроллером представления ‹= вот и все! Спасибо ! - person Karim; 20.06.2012

Вы переопределили viewWillAppear/viewDidAppear/viewWillDisappear/viewDidDisappear? Вы не забыли позвонить super из переопределения?

person rob mayoff    schedule 24.01.2012
comment
Я думаю, что причиной этого является тот факт, что у меня есть переход к раскадровке, и я вызываю PerformSegueWithIdentifier. Это может создавать переход дважды? Если это так, есть ли другой способ передать данные объекта в место назначения и не использовать PerformSegueWithIdentifier? - person ElasticThoughts; 25.01.2012
comment
Роб, хотя ваш ответ не решил мою проблему, он вызвал некоторый мыслительный процесс! Я исправил проблему - я опубликую ответ на мгновение. Спасибо. - person ElasticThoughts; 25.01.2012

У меня были segues, которые вели обратно к моему основному навигационному контроллеру, который вызывал это. Я решил проблему, вернув главный навигационный контроллер на вершину стека. Вот код:

- (void) viewDidAppear:(BOOL)animated
{
    [self.navigationController popToRootViewControllerAnimated:NO];
}
person Flea    schedule 10.06.2013

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

Я скопировал кнопку, а затем подключил ее. Это сработало, но я получил эту ошибку.

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

person PeterK    schedule 11.08.2012

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

person Maniac One    schedule 18.12.2013