Как создать загрузочный экран многократного использования? - PullRequest
1 голос
/ 07 мая 2009

Как создать загрузочный экран, который можно использовать в любое время. Мне известен файл Default.png, но мне нужна гибкость, чтобы подключить экран загрузки в любой момент в течение жизненного цикла приложения.

Это то, что я имею до сих пор.

//inside a method that gets called by a UIButton

LoadingViewController* loadController = [[LoadingViewController alloc] initWithNibName:@"Loading" bundle:nil vertical:NO];
[self.view addSubview: loadController.view];

//some method call that takes a few seconds to execute
[self doSomething];

//This loads some other view, my final view
[self.view addSubview: someOtherView]

но кажется, что вид загрузки никогда не отображается. Вместо этого предыдущий вид остается там до тех пор, пока не будет добавлен someOtherView. Я поместил журналы трассировки, и код, кажется, выполняется, я даже заменил [self doSomething] на sleep (2), но представление промежуточной загрузки никогда не отображается.

Если я удалю [self.view addSubview: someOtherView]; затем через несколько секунд ... (после того, как doSomething завершает выполнение) отображается представление загрузки, так как нет представления, которое выдвигается поверх него, однако это, очевидно, не та функциональность, которую я хочу.

Может объяснить это поведение? Есть ли что-то в цикле рендеринга, которое я неправильно понимаю, потому что не похоже, что представление (по крайней мере, на экране) мгновенно обновляется, хотя я вызываю [self.view addSubview: loadController.view];

Нужно ли мне создавать отдельный поток?

Ответы [ 2 ]

4 голосов
/ 07 мая 2009

Как правило, чтобы изменения в пользовательском интерфейсе были видны пользователю, элемент управления должен вернуться к основному runLoop. Вы вернетесь в runLoop только после того, как загрузите представление загрузки и замените его другим представлением. Одна из стратегий для решения этой проблемы - переместить код, выполняющий загрузку, в другой поток. Для этого можно использовать NSOperation и NSOperationQueue.

Еще более простой подход - использовать executeSelectorInBackground: withObject для выполнения обработки. После завершения обработки пользовательский интерфейс может быть обновлен снова, чтобы показать данные. Важно помнить, что обновления пользовательского интерфейса должны выполняться в основном потоке. Используйте executeSelectorOnMainThread: withObject: waitUntilDone: для выполнения этого из потока загрузки.

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

  • Отображение вида загрузки и запуск фонового процесса - это метод действия кнопки.
  • Выполнить фоновую загрузку - вызывается из функции действия кнопки с executeSelectorInBackground: withObject.
  • Удалите представление загрузки и обновите отображение данными - вызываемыми из фонового потока с помощью executeSelectorOnMainThread: withObject: waitUntilDone.
1 голос
/ 07 мая 2009

Я создал подкласс UIView, где я инициализировал, как должно выглядеть и выглядеть мое представление загрузки. (Мой взгляд появился и скользил снизу с красивой анимацией).

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

Затем я позволил всем моим viewcontroller'ам быть подклассом моего нового viewcontrollerclass, что позволило мне сделать:

[self showloadingMessage:@"loading..."];

во всех моих viewcontrollers ...

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