2010-04-21 3 views
1

У меня есть странная проблема с UIView:Iphone - UIView не отображается

Я хочу, чтобы показать индикатор активности View, который я создал с Interface Builder для обозначения длительных деятельности.

В функции viewDidLoad моего главного ViewController я инициализировать ActivityIndicator Посмотреть, как это:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];   
    load = [[ActivityIndicatorViewController alloc] init]; 
    ... 

Когда я нажимаю кнопку его называют этот IBAction:

- (IBAction)LaunchButtonPressed{    
    // Show the Activity indicator view. 
    [self.view addSubview:load.view]; 

    // eavy work 
    [self StartWorking];  

    // Hide the loading view. 
    [load.view removeFromSuperview];  
} 

В функции StartWorking я спросить запрос к интернет-сервису и проанализировать XML-файл, который он возвращает мне.

Проблема заключается в том, что если я вызываю функцию StartWorking, приложение не запускается, показывая представление индикатора активности, а с помощью функции StartWorking. Если я удаляю вызов функции StartWorking, отображается представление.

Может ли кто-нибудь объяснить мне, почему? : s

+0

Отображается ли представление после некоторой задержки или не отображается вообще? – Warrior

+0

Отображается сообщение avec задержка. –

ответ

2

Вы пытались вызвать метод StartWorking в другой теме?
Возможно, его тяжелый процесс не позволяет выполнять другие инструкции.

Посмотрите на класс NSThread, особенно detachNewThreadSelector: toTarget: withObject: метод.

EDIT: О проблеме бассейна, необходимо создать пул в методе StartWorking, если это называется на другом потоке:

- (void)StartWorking 
{ 
    NSAutoreleasePool * pool = [ [ NSAutoreleasePool alloc ] init ]; 

    /* Code here... */ 

    [ pool release ]; 
} 
+0

Он работает нормально, но весь мой объект автореферата протекает, потому что нет пула на месте. : s –

+0

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

1

Заменить: [self.view addSubview:load.view];

С: [self performSelector:@selector(addLoadingSubview) afterDelay:0.1f];

И создать метод: -(void)addLoadingSubview{[self.view addSubview:load.view];}

+0

Я пробовал, но результат тот же. Я использовал: [self performSelector: @selector (ShowActivityIndicatorView) withObject: nil afterDelay: 0.1f]; –

0

Хорошо, я нашел решение, основанное на Santoni ответ:

- (IBAction)LaunchButtonPressed{    
    // Show the Activity indicator view. 
    [self performSelector:@selector(ShowActivityIndicatorView) withObject:nil afterDelay:0]; 

    // eavy work 
    [self performSelector:@selector(StartWorking) withObject:nil afterDelay:2]; 

    // Hide the loading view. 
    [load.view removeFromSuperview];  
} 

Вид деятельности Индикатор dislayed перед вызовом функции тяжел ых.

Спасибо за ответ.

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