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];
    }
}

ここに画像の説明を入力してください

4

3 に答える 3

3

GUI要素を処理しようとしているためにアプリがクラッシュする理由、つまりUIAlertViewバックグラウンドスレッドで、メインスレッドで実行するか、ディスパッチキューを使用する必要があります

ディスパッチキューの使用

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

    dispatch_async(queue, ^{

     //show your GUI stuff here...

    });

または、このようにメインスレッドにGUI要素を表示できます

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

このリンクのスレッドでGUI要素を使用する方法について詳しく知ることができます

于 2013-02-16T11:04:32.460 に答える
1

UIAlertViewバックグラウンドスレッドからを表示しようとしているため、クラッシュが発生します。

これは絶対に行わないでください。すべてのUIの変更はメインスレッドから処理する必要があります。

交換:

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];
});
于 2013-02-16T11:07:47.077 に答える
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];
}

于 2013-02-16T11:08:12.923 に答える