Кнопка IOSНажмите и обновите вид - PullRequest
3 голосов
/ 25 октября 2011

В методе buttonClicked я хочу установить черный цвет текста в UILabel, подождать три секунды, а затем установить зеленый цвет.Тем не менее, этикетка никогда не становится черной.Метод ждет три секунды, затем текст UILabel становится зеленым.Я думал, что использование executeSelectorOnMainThread решит эту проблему, но это не так.Код ниже.Заранее большое спасибо и извинения, если я упускаю что-то очевидное.

Джон Р.

-(void) buttonClicked: (id) sender
{
    // (UILabel *) letterLabel is instance variable of TestProgramDelegate

    [letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES];

    [NSThread sleepForTimeInterval:3];

    [letterLabel performSelectorOnMainThread:@selector(setTextColor:) withObject: [UIColor greenColor] waitUntilDone:YES];
}

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Ваш метод меняет цвет синхронно дважды.Весь этот код выполняется в главном потоке.

// run on main thread
[letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES];

// buttonClicked: called on mainThread so this is on main thread
[NSThread sleepForTimeInterval:3];

// also on main thread ...
[letterLabel performSelectorOnMainThread:@selector(setTextColor:) withObject: [UIColor greenColor] waitUntilDone:YES];

Основной поток пользовательского интерфейса зацикливается и ищет код для запуска на основе таких вещей, как нажатия кнопок.Как только щелчок обнаружен, ваш метод выполняется, устанавливает цвет, ждет три секунды, а затем снова устанавливает цвет, прежде чем основной цикл пользовательского интерфейса сможет перерисовать.Поскольку пользовательский интерфейс не перерисовывается между ними, вы никогда не увидите первый.

Если вы хотите сделать это, вам нужно будет установить цвет, затем в фоновом потоке, подождать три секунды и затем вызватьвернуться к основному потоку для обновления пользовательского интерфейса.

Это сообщение по теме:

GCD, Потоки, поток программ и обновление пользовательского интерфейса

0 голосов
/ 25 октября 2011

- (void)buttonClicked:(id)sender будет вызываться в главном потоке, поэтому сбивает с толку, почему вы используете [letterlabel performSelectorOnMainThread:@selector(setTextColor:) withObject:[UIColor blackColor] waitUntilDone:YES];, когда контекст уже является основным потоком.

[letterlabel setBackgroundColor:[UIColor blackColor]]; - это все, что вам нужно для вызова при нажатии кнопки.

Вы можете использовать обратный вызов NSTimer или локальное уведомление, чтобы изменить цвет на зеленый. Как правило, не рекомендуется помещать основной поток в спящий режим в вашем приложении.

Надеюсь, это поможет!

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