2013-02-16 5 views
0

Мое приложение отправляет данные на сервер после того, как вы начинаете при передаче данных на активность индикатора сервера. Когда индикатор скрыт, я пытаюсь отобразить предупреждение о том, что данные были успешно отправлены. Но когда я пытаюсь снять предупреждение, приложение падает. В чем может быть проблема? Спасибо!Индикатор активности и предупреждение

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    activityIndicator = [[UIActivityIndicatorView alloc] init]; 
    activityIndicator.frame = CGRectMake(140, 190, 37, 37); 
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
    [self.view addSubview:activityIndicator]; 

} 


- (IBAction)sendForm:(id)sender { 
[self performSelectorInBackground:@selector(loadData) withObject:activityIndicator]; 
    [activityIndicator startAnimating]; 
} 

-(void)loadData { 
    NSURL *scriptUrl = [NSURL URLWithString:@"http://zav333.ru/"]; 
    NSData *data = [NSData dataWithContentsOfURL:scriptUrl]; 
    if (data) 
    { 
     NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://zav333.ru/sushi.php"] 
                   cachePolicy:NSURLRequestUseProtocolCachePolicy 
                  timeoutInterval:15.0]; 
     request.HTTPMethod = @"POST"; 
     // указываем параметры POST запроса 
     NSString* params = [NSString stringWithFormat:@"name=%@&phone=%@&date=%@&howmuchperson=%@&smoke=%@ ", self.name.text, self.phone.text, self.date.text, self.howmuchperson.text, self.smoke]; 
     *howMuchPerson, *smoke; 
     request.HTTPBody =[params dataUsingEncoding:NSUTF8StringEncoding]; 

     NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     [activityIndicator stopAnimating]; 

      UIAlertView* ahtung = [[UIAlertView alloc] initWithTitle:@"Спасибо" message:@"Ваша заявка принята!\nВ течение часа, Вам поступит звонок для подтверждения заказа" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [ahtung show]; 
    } 
} 

enter image description here

+0

, что журнал дисплея. – Dilip

+0

crash log/stack trace plz –

+0

Почему вы не пытаетесь запустить UIAlertView и [activityIndicator stopAnimating] в основном потоке. –

ответ

1

Катастрофа происходит потому, что вы пытаетесь отобразить UIAlertView из фонового потока.

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

Заменить:

UIAlertView* ahtung = [[UIAlertView alloc] initWithTitle:@"Спасибо" message:@"Ваша заявка принята!\nВ течение часа, Вам поступит звонок для подтверждения заказа" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [ahtung show]; 

С:

dispatch_async(dispatch_get_main_queue(),^{ 
      UIAlertView* ahtung = [[UIAlertView alloc] initWithTitle:@"Спасибо" message:@"Ваша заявка принята!\nВ течение часа, Вам поступит звонок для подтверждения заказа" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [ahtung show]; 
}); 
3

Причина, почему ваше приложение рушится, потому что вы пытаетесь справиться с GUI элементов, т.е. UIAlertView в фоновом потоке, вам нужно запустить его в основном потоке или попытаться использовать диспетчерских очереди

Использование Сопроводительных очередей

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 

    dispatch_async(queue, ^{ 

    //show your GUI stuff here... 

    }); 

ИЛИ вы можете показать элементы графического интерфейса пользователя на главном потоке, как это

[alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];

Вы можете иметь более подробную информацию об использовании GUI элементов на нитях на этом link

+1

+1 за ваш быстрый ответ и избиение меня :) –

1

Попробуйте

- (IBAction)sendForm:(id)sender { 
[self performSelectorInBackground:@selector(loadData) withObject:activityIndicator]; 
[activityIndicator startAnimating]; 
UIAlertView* ahtung = [[UIAlertView alloc] initWithTitle:@"Спасибо" message:@"Ваша заявка принята!\nВ течение часа, Вам поступит звонок для подтверждения заказа" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
[ahtung show]; 
} 

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