2010-08-20 102 views
0

蘋果文檔使這看起來很容易,但它不起作用。我的代碼是:UIActivityIndi​​cator問題

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

[activity startAnimating]; 

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.myserver.com"]]; 

[request setPostValue:name forKey:@"key"]; 


[request startSynchronous]; 
    NSLog(@"%@",[request responseString]); 

[activity stopAnimating]; 
[activity release]; 

我沒有UIBuilder設置任何東西,因爲坦率地說,我不明白它是如何工作與UIActivityIndi​​cator。使用上面的代碼構建和運行應用程序不會發送任何警告指示符,並且運行得很好,但我沒有看到活動指示符。

回答

1

在完成方法調用之前,UI將不會更新(或者直到在運行循環中更精確地進行下一次迭代),所以這將在同一步驟中有效地添加和刪除它。

您應該異步地處理您的請求以查看發生的事情,或者至少在主線程上獨立安排不同的任務(添加活動,請求本身並將其刪除)。但是阻止主線程是一個非常糟糕的主意,如果您的請求花費太長時間來響應(無論出於何種原因 - 易於使用Web服務),您的應用程序將完全被終止。

+0

我不太明白。我在發送請求之前開始動畫 - 然後發送請求(我的實際請求比我顯示的要大得多,但沒有必要修復我的問題 - 然後我停止動畫。我嘗試添加[self.view addSubview:activity] startAnimating之後,並沒有修復它 – startuprob 2010-08-20 17:22:06

+0

不需要。對UIKit所做的任何更改在運行循環的下一次迭代之前不會生效,它甚至不會在這些調用之間重新繪製屏幕上的單個像素 – Eiko 2010-08-20 17:55:56

2

@ Eiko的權利,你的用戶界面將阻止等待你的同步Web請求完成,但還有另一個問題。你甚至沒有將你的活動視圖添加到你的主視圖!

您需要給UIActivityIndicatorView *activity一個.frame的值,然後將它添加到視圖層次中。因此:

activity.frame = CGRectMake(0,0,50,50); //that'll be top-left corner 
[self.view addSubview:activity]; 
[activity startAnimating]; 

現在,當您進行網絡請求時,它會坐在那裏不旋轉,因爲您正在主線程上執行該請求。我非常高興你使用ASI,但你會以醜陋的方式去討論它。

使您的UIViewController符合ASIHttpRequestDelegate協議。

Set request.delegate = self;

執行-requestFinished(ASIHttpRequest *)request來處理您得到的響應,並在THAT方法中隱藏您的活動視圖。在這一點上,你可能會希望你已經將它命名爲財產,或者至少是一個iVar,所以你稍後會處理它。

+0

這聽起來很愚蠢,但我如何從不同的方法訪問「活動」? – startuprob 2010-08-20 19:23:09

+0

您將其設置爲綜合屬性,然後在實例化它時,將其分配給'self.activity'而不是' UIActivityIndi​​catorView *活動。 – 2010-08-20 19:38:25

0

嘗試將UIActivityIndi​​catorView創建置於不同的線程中。

0
 UIView *acty_view=[[UIView alloc]initWithFrame:CGRectMake(130,220, 60, 60)]; 
     acty_view.backgroundColor=[UIColor blackColor]; 
     acty_view.alpha = 0.6; 
     acty_view.layer.cornerRadius = 10; 
     acty_view.layer.masksToBounds = YES; 
     activitidicator = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(15, 15, 30, 30)]; 
     [activitidicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite]; 
     [activitidicator setColor:[UIColor whiteColor]]; 

     UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(8, 42, 100, 15)]; 
     [email protected]"Loading"; 
     [lbl setFont:[UIFont systemFontOfSize:10]]; 
     lbl.textColor = [UIColor whiteColor]; 
     // [lbl setFont:[UIFont fontWithName:@"Helvetica" size:13]]; 
     [acty_view addSubview:lbl]; 
     [acty_view addSubview:activitidicator]; 
     [self.view addSubview:acty_view]; 
     [activitidicator startAnimating]; 
     [self performSelector:@selector(CallWebserviceMethod) withObject:activitidicator afterDelay:0];` 

-(void)CallWebserviceMethod 
{ 
[self JsonResults]; 
[activitidicator stopAnimating]; 
} 
相關問題