Похоже, я нашел ошибку в методе pushViewController navigationController. Для того, чтобы воссоздать его я взял мастер подробный пример проекта и внесли некоторые изменения в методе -didSelectRow:
:ios7 navigationController pushViewController анимированная ошибка
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController* view = [self.storyboard instantiateViewControllerWithIdentifier: @"view"];
NSDate *object = _objects[indexPath.row];
[view setDetailItem:object];
[self.detailViewController.navigationController pushViewController:view animated:YES];
}
Я также изменил раскадровки идентификатор подробный вид на «вид». Вот что происходит:
При выборе любого из рядов хозяйских медленно (когда толчок анимация закончена) он работает отлично:
При выборе любой из строк в то время как анимация все еще показывает, детальный вид становится неактивным (показывает последнюю строку, которая была вызвана с методом толкающего перед ошибкой), и только панель навигации показывает толкающую анимацию нового взгляда:
Когда это произойдет, вы получите несколько предупреждений в выводе отладчика:
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
nested push animation can result in corrupted navigation bar
Unbalanced calls to begin/end appearance transitions for <DetailViewController: 0x8a6e070>.
Вот противная часть: если вы возвращаетесь на панели навигации подробного вида, а затем выберите другую строку в Tableview Учителей или вернуться дважды в деталях сбоев приложения с
Can't add self as subview
НО если вы запустить тот же код на ios6, он работает без каких-либо проблем или предупреждений.
Существующие решения:
Вызов метода с анимационной: NO, кажется, работает без каких-либо проблем, очевидно, нет толчок анимации.
Другое решение состоит в том, чтобы иметь логическое значение в Master, чтобы установить значение false при вызове метода push и присвоении значения true из параметра Detail in DetailDidAppear. Таким образом, вы можете проверить значение при вызове метода push. Недостатки: tableView может выглядеть слишком долго, если вы попытаетесь быстро выбрать одну и ту же строку, если вы выберете другую строку быстро, тогда она не будет отображаться в деталях, но она будет выбрана в главном столе и подсвечена, вы можете сохранить выбранную строку индексировать и изменять выбор в коде, но это приводит к мерцанию выделения строк.
Оба решения предполагают некоторый компромисс, поэтому я хотел бы найти другой способ справиться с этим. Есть ли лучшие решения?
Похоже, вы понимаете, что происходит, как и любой. Если у вас есть вопрос, пожалуйста, укажите его явно. Если вы просто предлагаете это как полезное наблюдение для других, вы должны переписать его в форме вопроса, добавить решения в ответ и принять ответ, чтобы было ясно, что вам не нужны люди, чтобы тратить на него время. Кроме того, если вы еще этого не сделали, вам следует сообщить об ошибке Apple (https://developer.apple.com/bug-reporting/). – Caleb
Извините, что я намеревался опубликовать это, чтобы найти другие способы обойти это – Arnas