iPhone Как сохранить просмотр штатов - PullRequest
1 голос
/ 26 июля 2011

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

У меня есть навигационный контроллер, управляющий представлениями в моем приложении, однако каждый загруженный, использованный и отодвинутый экран теряет всю информацию, поскольку она кажется восстановленной ... Я полагаю, что это возможная проблема управления памятью?

Но как мне создать приложение, которое перемещается и сохраняет всю информацию в своих представлениях, пока приложение не будет закрыто.

Спасибо:)

Ответы [ 6 ]

2 голосов
/ 26 июля 2011

Возможно, вы не сохранили ссылку на контроллер вида, проблема в том, что UIVIewController не может быть выпущено.

Сделайте контроллер вида иваром, который вы будете использовать только один раз, когда вы его нажметев стеке.

// in .h
MyViewController *mVC;

// in .m
// maybe when the user selects a row in a tableview
if(mVC == nil) {
    // first time use, alloc/init
    mVC = [[MyViewController ....];
}
// then push on the stack
[self.navigationController ....];

Конечно, не забудьте выпустить его позже.

1 голос
/ 26 июля 2011

В этой части:

MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];

Возможно, у вас будет что-то вроде этого ... Вместо этого сделайте ваш myViewController свойством класса, чтобы у вас была ссылка на него. И бросьте оператор [myViewController release];.

0 голосов
/ 26 июля 2011

Вы можете использовать NSUserDefaults для сохранения состояний UIControls в представлении.

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

0 голосов
/ 26 июля 2011

UINavigationController работает как стек: вы помещаете в него UIViewController и вставляете его в него. Это означает, что при извлечении UIViewController его счетчик хранения будет уменьшен на 1, и если ни один другой объект не имеет ссылки на него, он будет освобожден. Вы можете избежать освобождения UIViewControllers, сохранив ссылку на них самостоятельно, вызвав -retain для объектов, например, в вашем appDelegate.

0 голосов
/ 26 июля 2011

Попробуйте сохранить данные в NSUserDefaults, если оно маленькое, или используйте plist, или оно слишком маленькое, например, 5-10 объектов, сохраняемых в некоторой переменной в appDelegate, а если слишком большое, используйте sqlite и для сохранить что-то вроде изображений из файлов, таких как XML использовать Document directory

0 голосов
/ 26 июля 2011

Возможно, ваше приложение получает didReceiveMemoryWarning.

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

Для дальнейшей проверки переопределите didReceiveMemoryWarning в одном из контроллеров представления или applicationDidReceiveMemoryWarning в делегате приложения и установите в нем точку останова. Не забудьте правильно назвать [super...], в противном случае довольно скоро ваше приложение будет убито. Таким образом, вы должны видеть, что представления не исчезают до достижения точки останова, а исчезают после этого.

Если гипотеза верна, вы должны найти способ сохранить состояние вашего взгляда в viewDidUnload и восстановить его в viewDidLoad. Смотрите также ссылку didReceiveMemoryWarning .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...