установка скрытого свойства не вступает в силу немедленно - PullRequest
0 голосов
/ 08 ноября 2011

Так что я использую подпредставление, которое содержит метку, индикатор активности и представление uiimageview. У меня есть это в подпредставлении, и я скрываю это по умолчанию при загрузке, я выскакиваю подпредставление. Тем не менее, подпредставление не показывается само по себе, пока ПОСЛЕ того, как я завершу то, что мне нужно, означает, что оно появляется в течение примерно 0,01 секунды, а не в течение времени, которое я хочу, чтобы оно

Я пытался сделать что-то вроде этого.

  do{
     loadingSubview.hidden=false; 
  }while(loadingSubview.hidden);   

, чтобы убедиться, что свойство установлено перед тем, как двигаться дальше, но оно дает те же результаты. Есть ли что-то, что я делаю неправильно?

Ответы [ 4 ]

2 голосов
/ 08 ноября 2011

Основная причина вашей "проблемы" заключается в том, что вы не позволяете циклу обработки событий обрабатывать события.Рисование является одним из них.Другой - это события взаимодействия с пользователем и т. Д. Если вы действительно хотите немедленно скрыть кнопку, вы можете сделать следующее:

loadingSubview.hidden = NO; // why "false"??? :)
[self performSelector:@selector(timeConsumingStuff)
           withObject:nil
           afterDelay:0]; // 0 is good here == "when idle"

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

Другое решение - это явная обработка событий цикла выполнения.(Посмотрите на [NSRunLoop runMode:beforeDate:]. Но ... если вы не перенесете свои трудоемкие вещи в другой поток, штраф все равно будет.

1 голос
/ 08 ноября 2011

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

Если вы хотите отложить реакцию на что-либо, используйте один из:

[self performSelector:@selector(mydelayedtask) withObject:nil afterDelay:1.0f];

, который даст вамзадержка в 1 секунду.

1 голос
/ 08 ноября 2011

Вам необходимо выйти из текущего метода (методов) обратно в цикл выполнения для любых обновлений пользовательского интерфейса.

Перейдите к другим действиям после этого обновления пользовательского интерфейса, позже в другой задаче NSTimer илидругая отложенная операция (подойдет всего пара десятков миллисекунд).Не ждите внутри метода.

0 голосов
/ 08 ноября 2011

Просто позвоните:

[loadingSubview setNeedsDisplay];

Вы должны прочитать " Цикл рисования вида ", описанный здесь: http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html

...