2010-03-24 2 views
0

Я разрабатываю приложение для iPhone, которое поддерживает навигацию на основе табуляции с пятью вкладками. Каждая вкладка содержит UITableView, данные которого извлекаются удаленно. В идеале я хотел бы использовать один UIActivityIndicatorView (подвид окна), который запускается/останавливается во время этого удаленного поиска - один раз за вкладку.Почему мой UIActivityIndicatorView отображается только один раз?

Вот как настроить вертушку в AppDelegate:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    [window addSubview:rootController.view]; 

    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    [activityIndicator setCenter:CGPointMake(160, 200)]; 
    [window addSubview:activityIndicator]; 

    [window makeKeyAndVisible]; 
} 

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

- (void)parseXMLFileAtURL:(NSString *)URL { 
    NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init]; 

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    NSLog(@"parseXMLFileAtURL started."); 
    [appDelegate.activityIndicator startAnimating]; 
    NSLog(@"appDelegate.activityIndicator: %@", appDelegate.activityIndicator); 

    articles = [[NSMutableArray alloc] init]; 

    NSURL *xmlURL = [NSURL URLWithString:URL]; 

    rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 
    [rssParser setDelegate:self]; 
    [rssParser setShouldProcessNamespaces:NO]; 
    [rssParser setShouldReportNamespacePrefixes:NO]; 
    [rssParser setShouldResolveExternalEntities:NO]; 
    [rssParser parse]; 

    NSLog(@"parseXMLFileAtURL finished."); 
    [appDelegate.activityIndicator stopAnimating]; 

    [apool release]; 
} 

Этот метод вызывается каждым контроллером вида следующим образом:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    if ([articles count] == 0) { 
    NSString *path = @"http://www.myproject.com/rss1.xml"; 
    [self performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:path]; 
    } 
} 

Это прекрасно работает, пока приложение загружает первый вкладки содержание. Мне представлен пустой стол и прядильщик. Как только содержимое загружается, прядильщик уходит.

Странно, когда я нажимаю вторую вкладку, сообщения NSLog из -parseXMLFileAtURL: метод отображаются в журнале, но экран висит на представлении первой вкладки, и я не вижу счетчика. Как только содержимое будет загружено, появится представление второй вкладки.

Я подозреваю, что это связано с резьбой, с которой я все еще знаком. Я делаю что-то явно неправильно здесь?

ответ

3

Вы должны выполнить все действия по индикатору активности на главном потоке с помощью:

performSelectorOnMainThread:withObject:waitUntilDone: 
+0

Спасибо, Diederik. Я использовал spinner, используя ваш совет, хотя мне потребовалось некоторое время с тех пор, как у меня было еще несколько ошибок. –

Смежные вопросы