【问题标题】:Activity Indicator and alert活动指示器和警报
【发布时间】:2013-02-16 10:37:37
【问题描述】:

我的应用程序在您知道将数据传输到服务器指示器活动时将数据发送到服务器。当指示器隐藏时,我试图显示数据已成功发送的警报。但是当我试图撤销警报时,应用程序就会失败。可能是什么问题?谢谢!

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

【问题讨论】:

  • 崩溃日志/堆栈跟踪 plz
  • 为什么不尝试在主线程中运行 UIAlertView 和 [activityIndi​​cator stopAnimating]。
  • 我添加了。我理解正确吗?
  • Prajwal Rauniyar,我该怎么做?
  • 你应该尝试调用 [alertView show];不是来自背景。

标签: ios android-activity alert indicator


【解决方案1】:

您的应用程序崩溃的原因是您试图处理您的 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];

您可以在link 上了解有关在线程上使用 GUI 元素的更多详细信息

【讨论】:

    【解决方案2】:

    发生崩溃是因为您试图从后台线程显示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];
    });
    

    【讨论】:

      【解决方案3】:

      尝试

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多