2012-07-10 35 views
5

Tôi đang viết một ứng dụng iOS và tôi phải hiển thị UIAlertView với một spinner. Đôi khi, xảy ra sự cố khi tôi cố thêm spinner vào giữa cảnh báo, thường là khi có cảnh báo khác trước cảnh báo này (không chính xác quy tắc, nhưng đây là cách tôi nhận thấy nó không thành công).UIActivityIndicatorView không hiển thị ngay trên UIAlertView

Tôi đã giải quyết một phần lỗi này bằng cách trì hoãn việc tạo bộ xoay tròn. Dưới đây là cách tôi làm điều đó (cảnh báo là thành viên UIAlertView):

Mã này là trong viewDidLoad:

alert = [[[UIAlertView alloc] initWithTitle:@"Loading..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; 

[alert show]; 

[self performSelector:@selector(addSpinner) withObject:nil afterDelay:0.5f]; 

Và đây là một trong addSpinner tôi chức năng:

- (void) addSpinner{ 

    UIActivityIndicatorView *indicator2 = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 

    indicator2.center = CGPointMake(alert.bounds.size.width/2, alert.bounds.size.height - 50); 

    [indicator2 startAnimating]; 
    [alert addSubview:indicator2]; 
    [indicator2 release]; 
} 

Giải pháp này đang hoạt động mọi lúc, nhưng tôi thực sự không thích cách nó được thực hiện. Mặc dù cho thấy spinner nửa giây sau khi cảnh báo bật lên không phải là quá nhiều phiền nhiễu, phải có một cách tốt hơn để xử lý này. Tôi không phải là một chuyên gia trong iOS, tôi cũng không phải là một lập trình viên cao cấp, nhưng tôi không thể sử dụng một sự kiện? Một cái gì đó như "khi cảnh báo thực sự được hiển thị, hãy chuyển sang chức năng addSpinner"? Tôi không có ý tưởng làm thế nào để làm điều này, và không thể tìm thấy nhiều trợ giúp trên trang web ...

Hy vọng ai đó có thể giúp tôi! Cảm ơn.

Trả lời

5

Thay vào đó, bạn có thể sử dụng https://github.com/jdg/MBProgressHUD.

và cho spinner trong cảnh báo, bạn có thể sử dụng các phương pháp này.

-(void)startLoading 
{ 
    alert = [[UIAlertView alloc] initWithTitle:@"" message:@"Please Wait..." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil]; 

    UIActivityIndicatorView *progress= [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)]; 
    progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 
    [alert addSubview:progress]; 
    [progress startAnimating]; 
    [progress release]; 
    [alert show]; 
} 
-(void)stopLoading 
{ 
    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    [alert release]; 
} 
+0

Cảm ơn điều đó, có vẻ khá tốt, tôi có thể thử sử dụng nó. Tôi không thể đánh dấu câu trả lời của bạn là "câu trả lời được chấp nhận" của tôi, vì nó không thực sự giải quyết vấn đề :) – rdurand

+1

không có vấn đề :) .. bạn chỉ có thể bỏ phiếu, nếu nó hữu ích :) – waheeda

+1

Tôi đã thêm một số mã để giải quyết vấn đề của bạn, hy vọng nó sẽ giúp. – waheeda

2

Hãy thử điều này

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 
megaAlert = [[[UIAlertView alloc] initWithTitle:@"Please wait..." 
                 message:nil delegate:self cancelButtonTitle:nil 
               otherButtonTitles: nil] autorelease]; 
[megaAlert show]; 
indicator = [[UIActivityIndicatorView alloc]              initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
      indicator.center = CGPointMake(megaAlert.bounds.size.width/2,           megaAlert.bounds.size.height - 45); 
[indicator startAnimating]; 
[megaAlert addSubview:indicator]; 
[indicator release]; 

Để bỏ qua những chỉ số sử dụng mã này

[megaAlert dismissWithClickedButtonIndex:0 animated:YES]; 
megaAlert = nil; 
[indicator stopAnimating]; 
+0

Cảm ơn.Đây là cơ bản những gì tôi đã làm ở nơi đầu tiên, mà không loại bỏ cảnh báo ... Bạn có nghĩ rằng nó có thể ảnh hưởng đến vị trí của UIActivityIndicator? Tôi sẽ cho bạn biết nếu nó hoạt động trong một vài phút. – rdurand

+0

Có vẻ như vấn đề xuất hiện vì vị trí của UIActivityIndicator được đặt trước khi UIAlertView được hiển thị. Tôi không nghĩ rằng việc loại bỏ cảnh báo sẽ giải quyết vấn đề này ... – rdurand

1

Cũng cần nhớ để loại bỏ thông báo trong chủ đề chính:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.alert dismissWithClickedButtonIndex:0 animated:YES]; 
}); 
4

Về cơ bản vấn đề vẻ thêm UIActivityIndicator trước UIAl ertView được hiển thị. Hãy thử sử dụng phương thức UIAlertView Delegate để thêm Chỉ số như dưới đây.

//AlertView delegate methods 
- (void)didPresentAlertView:(UIAlertView *)alertView 
{ 
    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 

    indicator.center = CGPointMake(alertView.bounds.size.width/2, alertView.bounds.size.height/3 * 2); 

    [indicator startAnimating]; 
    [alertView addSubview:indicator]; 
} 
+1

Cảm ơn câu trả lời muộn, nó có thể giải quyết được vấn đề, nhưng tôi không phải đối mặt với nó nữa, như tôi đã sử dụng MBProgressHUD. – rdurand

Các vấn đề liên quan