viewDidAppear, но где находится viewDidShowToUser? - PullRequest
0 голосов
/ 10 августа 2010

У меня есть iphone3g с этой функцией в моем ViewController

- (void)viewDidAppear:(BOOL)animated {

[super viewDidLoad];

}

Я использую приложение TabBar для iphone. Но когда я щелкаю от вкладки 1 до вкладки 2 и отлаживаю контроллер второго представления, он останавливается до того, как представление фактически окажется в представлении пользователей.

Таким образом, при нажатии на вкладку 2 до тех пор, пока каждая функция внутри - (void) viewDidAppear: (BOOL) анимация не будет завершена, пользователь увидит представление.

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

Ответы [ 3 ]

4 голосов
/ 10 августа 2010

Прежде всего, вы звоните [super viewDidLoad] вместо [super viewDidAppear:animated] внутри вашей реализации -viewDidAppear:

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

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

  1. В вашей реализации viewDidAppear: вы можете использовать performSelector:withObject:afterDelay:, чтобы поставить работу в очередь. Этот метод вернется немедленно и запланирует вызов вашего селектора в любой указанный вами период времени. Если вы передадите значение 0 в качестве задержки, оно будет поставлено в очередь для запуска на следующей итерации цикла выполнения, что эффективно даст вам возможность вернуться из метода и сохранить отзывчивость пользовательского интерфейса.

  2. Вы можете использовать блоки, если вы не нацеливаетесь на что-либо ниже iOS4, и использовать мощь Grand Central Dispatch, чтобы сделать вашу работу приятной и безопасной.

1 голос
/ 10 августа 2010

вы вызываете super для viewDidLoad: внутри viewDidAppear: .... измените строку [super viewDidLoad]; на [super viewDidAppear:animated];

0 голосов
/ 10 августа 2010

Нет простого способа узнать.

UIKit делает UIViews.UIViews привлечь к CALayers.CALayers обрабатываются CoreAnimation.

CoreAnimation решает, когда запрашивать UIView для рисования слоев.Он рисует все слои на экране и затем комбинирует их на графическом процессоре.Только после их компоновки на экране отображается обновленный интерфейс.Это разделение происходит для того, чтобы CoreAnimation могла выполнять большую часть работы независимо от потока пользовательского интерфейса, но это означает, что вы не можете легко определить, что «на самом деле на экране».

Нет простого способасказать, когда на экране действительно что-то отображается (кроме теперь закрытого UIGetScreenImage ()).viewDidAppear: вызывается после того, как UIKit завершает создание (и анимацию) представлений / слоев.В этот момент они будут «видны» CoreAnimation после следующего цикла выполнения и вскоре будут отображаться.Если вы выполняете большую обработку в viewDidAppear:, то CoreAnimation никогда не увидит обновленное «дерево модели».

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