В некоторых точках моего проекта мне нужно выполнить несколько синхронных вызовов веб-службы или прочитать данные из CoreData. Выполнение этих операций может занять пару секунд, поэтому я создал класс LoadingView
, который является подклассом UIView
, который имеет простое сообщение и UIActivityIndicatorView
. Для обычных UIButton
я просто [myLoadingView setHidden:NO]
на событии Touch Down
и [myLoadingView setHidden:YES]
на событии Touch Up Inside
. Все это работает именно так, как я хочу.
Проблема в том, что я не могу понять, как это сделать с помощью клавиши Return
на клавиатуре. Из того, что я могу сказать, есть только 1 метод, который вызывается, когда пользователь касается клавиши Return
(UITextFieldDelegate
protocol
textFieldShouldReturn:
), и мне нужно два метода, чтобы моя техника [myLoadingView setHidden:NO]
-> [myLoadingView setHidden:YES]
работала, так как цель- C не обновляет экран до самого конца метода, в отличие от постоянного обновления экрана, как в других языках.
Как я могу сделать так, чтобы мой экран загрузки отображался, как только пользователь коснется клавиши Return
, выполнит некоторые операции и скроет экран загрузки после выполнения операций?
ИЗМЕНИТЬ:
Я пробовал использовать NSNotificationCenter
, но, кажется, столкнулся с той же проблемой. Например, если у меня есть метод UIButton
Touch Up Inside
:
- (void) btnClick:(id) sender
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"Show Loading" object:nil];
// Do stuff that takes a long time here
[[NSNotificationCenter defaultCenter] postNotificationName:@"Hide Loading" object:nil];
}
Где в моем LoadingView.m
у меня есть:
- (id) init
{
self = [super init];
if (self)
{
// Do normal init stuff here
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showLoading) name:@"Show Loading" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideLoading) name:@"Hide Loading" object:nil];
}
return self;
}
- (void) showLoading
{
// Do stuff to set up the loading screen
[self setHidden:NO];
}
- (void) hideLoading
{
[self setHidden:YES];
}
При такой настройке, когда я нажимаю кнопку, я никогда не вижу экран загрузки. Когда я публикую уведомление, оно выполняется и сразу же меняет экран? Если да, значит, я делаю что-то не так, возможно, в своих // Do stuff
частях. Если это не так, я не думаю, что NSNotificationCenter
мне чем-то поможет =(.
РЕДАКТИРОВАТЬ 2:
Я настроил быстрый тестовый проект, и я подтвердил, что уведомления НЕ обновляют экран сразу. Код btnClick
, который я разместил в моем последнем EDIT, ведет себя точно так же, как простое выполнение
- (void) btnClick:(id) sender
{
[loadingView setHidden:NO];
// Do stuff that takes a long time here
[loadingView setHidden:YES];
}
Так что это подтверждает, что ничто из того, что зависит от NSNotificationCenter
, мне не поможет.
Действительно, похоже, что нет поддержки смены экрана во время синхронной работы, что очень разочаровывает. У меня нет идей на данный момент.
NSNotificationCenter
? 09.12.2013