Как перейти к UIViewController в раскадровке и при этом сохранить навигационную иерархию?

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

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

Каков правильный способ справиться с этим? Должен ли я просто просмотреть раскадровку до точки, где пользователь остановился, представляя каждый UIViewController с анимацией, установленной на NO, пока я не доберусь до того, на котором был пользователь? (И если да, то как лучше всего хранить эту информацию? Существуют ли какие-либо методы/классы, которые могут помочь в этом, или я использую свой собственный способ хранения их через раскадровку?)


person cc.    schedule 21.02.2012    source источник
comment
Вы не должны ничего делать. В ios5 программа просто перейдет в фоновый режим, когда пользователь покинет приложение, и вернется туда, где он остановился, когда снова выберет ваше приложение. Есть ли что-то большее, чем проблема?   -  person T.J.    schedule 21.02.2012
comment
Полагаться на это для восстановления состояния недостаточно, верно? Например, если пользователь перезагружает устройство, это состояние теряется.   -  person cc.    schedule 21.02.2012
comment
Обычно пользователь перезагружается, чтобы сбросить все, включая ваше приложение. Если пользователь не потеряет данные, вам не нужно сохранять состояние вашего приложения. Если есть потенциальная потеря данных, вам все равно нужно сохранить данные, определив, не переводится ли приложение в фоновый режим, и затем сохранив его.   -  person T.J.    schedule 22.02.2012


Ответы (1)


Один из вариантов — использовать NSUserDefaults< /а>. Вы не можете точно сохранить точные экземпляры UIViewControllers на диск и получить их, как если бы они были в памяти. Что происходит, так это то, что вы должны как-то, например. ключ/значение, определите каждый из ваших viewController'ов, которые вас интересуют, и хотите сохранить их состояние. Также вам нужно указать каждый элемент, состояние которого вы хотите сохранить, а затем сохранить его с помощью NSUserDefaults.

Например, предположим, что у вас есть такая иерархия:

HomeView > ListOfNotes > NoteAtIndexPath: x

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

 [[NSUserDefaults standardUser] setInteger:5 forKey:IndexOfLastNoteViewed];
 [[NSUserDefaults standardUser] setFloat:17.0 forKey:LasFontSizeViewed];

Когда приложение снова запустится, вы можете проверить ключи и программно перейти к HomeView > ListOfNotes > NoteAtIndexPath:5.

Вот несколько ссылок, которые могут вам помочь:

person Canopus    schedule 21.02.2012
comment
Правильно - меня беспокоит не состояние сохранения данных отдельных UIViewController. Как я запускаю непосредственно правильный UIViewController при запуске приложения, чтобы иерархия оставалась неизменной? - person cc.; 21.02.2012
comment
Если вы посмотрите на это с точки зрения кода, иерархия в любом случае останется неизменной. Ваша точка зрения заключается в том, как восстановить последнее состояние, которое просматривал пользователь. И ответ заключается в том, что вам нужно записать те настройки, которые могут быть изменены пользователем, и снова установить для них переменные, когда вы вернетесь в приложение. Иерархия не может быть изменена пользователем. Он встроен в ваш дизайн. Хотя с точки зрения пользователя он перескакивает с одного вида на другой, программно вы знаете, как он туда попал. Сохранив это в NSUserDefaults, вы создадите ориентир, к которому можно вернуться. - person Canopus; 22.02.2012