UIAlertView отображается только после его закрытия - PullRequest
0 голосов
/ 06 октября 2011

Я пытался выяснить это в течение 2 дней, и прежде чем кто-либо отправит другой вопрос stackoverflow, я прочитал их все, и ни один из них точно не покрывает мою проблему:

У меня есть CoreDataприложение, которое обновляется динамически.Теперь во время обновления я хочу, чтобы всплыло окно UIAlertView, сообщающее, что загружается обновление.

Итак, вот важный код:

AppDelegate:

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [myUpdater checkForUpdatesInContext:self.managedObjectContext];    
}

_

Updater Class:

- (void)checkForUpdatesInContext:(NSManagedObjectContext *)myManagedObjectContext
{
    [self loadUpdateTime];
    NSLog(@"Update start");
    NSDate *now = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone localTimeZone] secondsFromGMT]];
    if ([now timeIntervalSinceDate:updateTime] < UPDATE_TIME_INTERVAL)
    {
        return;
    }
    [self showAlertViewWithTitle:@"Update"];
    ... //updating process
    [self.alertView dismissWithClickedButtonIndex:0 animated:YES];
    NSLog (@"Update done");
}

- (void) showAlertViewWithTitle:(NSString *)title
{
    self.alertView = [[UIAlertView alloc] initWithTitle:title message:@"Daten werden aktualisiert..." delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    ... //design the alertView
    [self.alertView show];
    NSLog (@"AlertView shows");
}

Итак, вот что происходит, когда я запускаю это:

  1. Запускаемое изображение показывает
  2. NSLog "Обновление запускается" запускается
  3. NSLog "AlertView показывает" срабатывает
  4. Экран тускнеет, но AlertView не отображается
  5. Обновление запущено
  6. Запускается NSLog "Обновление завершено"
  7. Запускаемое изображение исчезает, и TabBarController показывает
  8. UIAlertView обнаруживается и сразу же закрывается, а затемненный экран возвращается к нормальному состоянию

Что я хотел бы, чтобы произошло:

  1. Запустите изображение
  2. TabBarControllerотображается
  3. Экран затемняется, и UIAlertView показывает
  4. Обновление запущено
  5. UIAlertView отключается, а затемненный экран возвращается в нормальное состояние

Я знаю, что-тос темой пользовательского интерфейса и основной темой и прочее .. Но я триЭто похоже на каждую комбинацию, но все еще не ожидаемый результат.Пожалуйста, помогите:)

РЕДАКТИРОВАТЬ:

HighlightsViewController Class:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.updater = [[Updater alloc] init];
    [updater checkForUpdatesInContext:self.managedObjectContext];

    ... // other setup stuff nothing worth mentioning
}

Это правильное место для вызова [super viewDidLoad]?Поскольку это все еще не работает, обновление выполняется, пока на экране отображается Launch Image.: - ((Я собираюсь отказаться от этого ..

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Вот и все, в этом прототипе все работает именно так, как вы хотите.

Заголовок:

#import <UIKit/UIKit.h>

@interface AlertViewProtoViewController : UIViewController
{

}

- (void) showAlertViewWithTitle:(NSString *)title;
- (void) checkForUpdatesInContext;
- (void) update;
- (void)someMethod;
- (void)someOtherMethod;

@end

#import "AlertViewProtoViewController.h"

Класс:

@implementation AlertViewProtoViewController

UIAlertView *alertView;
bool updateDone;
UILabel *test;
bool timershizzle;

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.view.backgroundColor = [UIColor yellowColor];

    UILabel *test = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
    test.backgroundColor = [UIColor blueColor];
    [self.view addSubview:test];

    [self performSelector:@selector(checkForUpdatesInContext) withObject:nil afterDelay:0.0];
}


- (void)update
{
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //commented for auto ref counting
    NSLog(@"update start");
    //your update stuff
    NSLog(@"update end");
    updateDone = YES;
    //[pool release];
}

- (void)checkForUpdatesInContext//:(NSManagedObjectContext *)myManagedObjectContext
{
    //[self loadUpdateTime];

    NSLog(@"Update start");

    NSDate *now = [NSDate dateWithTimeIntervalSinceNow:[[NSTimeZone localTimeZone] secondsFromGMT]];
    //    if ([now timeIntervalSinceDate:updateTime] < UPDATE_TIME_INTERVAL)
    //    {
    //        return;
    //    }
    [self showAlertViewWithTitle:@"Update"];
    //[self setManagedObjectContext:myManagedObjectContext];

    [self performSelector:@selector(someMethod) withObject:nil afterDelay:0.0];

    [self performSelector:@selector(someOtherMethod) withObject:nil afterDelay:0.0];
}

-(void)someOtherMethod
{
    while (!updateDone) {
        //        NSLog(@"waiting...");
    }

    [alertView dismissWithClickedButtonIndex:0 animated:YES];
    NSLog (@"Update done");
    self.view.backgroundColor = [UIColor greenColor];
}

-(void)someMethod
{
    [self performSelectorInBackground:@selector(update) withObject:nil];
}

- (void) showAlertViewWithTitle:(NSString *)title
{
    alertView = [[UIAlertView alloc] initWithTitle:title message:@"Daten werden aktualisiert..." delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
    alertView.frame = CGRectMake(100, 100, 200, 200);
    alertView.backgroundColor = [UIColor whiteColor];

    [self.view addSubview:alertView];

    [self.view setNeedsDisplay];

    NSLog (@"AlertView shows");
}

@end

Вы должны настроитьбыли необходимы для ваших собственных целей, но это работает.

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

Вы запускаете фоновый поток, а затем немедленно прекращаете уведомление. Я хотел бы предложить, чтобы вы использовали NSNotification, отправленное из фоновой задачи и полученное в зависимости от того, какой контроллер запускает оповещение, вызывая метод, который отклонил оповещение.

Я нахожу интерфейс UIAlertView неподходящим для этого типа уведомлений пользователя и предпочитаю использовать полупрозрачный вид наложения с UIActivityIndicatorView, плюс информационное сообщение для пользователя.

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

Вы делаете:

- (void)applicationDidBecomeActive:(UIApplication *)application

Не правда ли, что для просмотра предупреждений, которое вы хотите показать, необходимо загрузить представление, которое еще не активно в данный момент? Смотри: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAlertView_Class/UIAlertView/UIAlertView.html

Подобный вопрос? UIAlertView начинает показывать, экран тускнеет, но не появляется, пока не стало слишком поздно!

...