2011-12-13 48 views
0

我正在玩一個簡單的測試應用程序,它只是循環顯示10張圖像並將每個圖像顯示在視圖中。下一張圖片將在用戶點擊一個按鈕後顯示。我遇到的問題是視圖永遠不會出現(圖像或按鈕)。當我按下按鈕子句時,代碼將運行並顯示最後一個圖像。 continueRunningScript最初是YES。只在iPhone上顯示最後一張圖像

@interface ViewController : UIViewController <UIAlertViewDelegate> 
{ 
    BOOL continueRunningScript; 
    UIButton *wrongButton; 
    UIImageView *imageView; 
} 

// ... 

@end 

@implementation ViewController 

// ... 

- (void) xxx { 

    for (int i = 0; i<10; i++) { 

     while (continueRunningScript == NO) { 
      // Stay here until button is pressed. 
     } 

     UIImage *testImg = ... // code to load the image at index i 

     imageView = [[UIImageView alloc] initWithImage: testImg]; 

     [self.view addSubview:imageView]; 

     wrongButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [wrongButton addTarget:self 
         action:@selector(incorrectResultButtonPress:) 
       forControlEvents:UIControlEventTouchUpInside]; 
     [wrongButton setTitle:@"Wrong Result?" forState:UIControlStateNormal]; 
     wrongButton.frame = CGRectMake(80.0, 310.0, 160.0, 40.0); 
     [self.view addSubview:wrongButton]; 

     continueRunningScript = NO; 

     [testImg release]; 
    } 
    [imageView release]; 
    [wrongButton release]; 
} 

// button press handling... 

// UIAlertViewDelegate 
- (void) alertView: (UIAlertView *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex { 

    // The user clicked one of the Yes/No buttons 
    if (buttonIndex == 0) // Yes 
    { 
     UIAlertView *thankyouAlert = [[UIAlertView alloc] initWithTitle:@"Thank You" 
                   message:@"Thanks for the feedback!" 
                   delegate:self 
                 cancelButtonTitle:nil 
                 otherButtonTitles:nil]; 
     [thankyouAlert show]; 
     // Call performSelector delegate method of NSObject to call class method dismissAlertView 
     [self performSelector:@selector(dismissAlertView:) withObject:thankyouAlert afterDelay:2]; 
     [thankyouAlert release]; 
     [wrongButton removeFromSuperview]; 
     continueRunningScript = YES; 
    } 
} 

// ... 

@end 
+0

這是因爲您正在循環中重新分配相同的`imageView`引用。當你完成循環時,它總是指向最後一個對象。 – Joe 2011-12-13 19:22:52

+0

未來,在發佈之前,請檢查您的代碼格式,但我現在已經爲您修復了它。 – 2011-12-13 19:24:01

+0

但是爲什麼在循環的第一次迭代中,當i = 0時什麼都不顯示給視圖? – 2011-12-13 19:41:19

回答

1

我假設你沒有在後臺線程或任何東西上執行此操作。如果你是,那麼你應該知道,UIKit只能用於主線程。

while (continueRunningScript == NO) { 
    // Stay here until button is pressed. 
} 

這不會按照您希望的方式工作。它將進入一個無限循環。執行線程不會超過此點來處理任何輸入事件,因此變量將永遠不會有機會設置爲YES

您必須記住,退出您的方法後,所有用戶界面代碼都將運行。如果你把純粹的,然後你循環所有的圖像被添加,然後用戶界面被更新。這就是爲什麼你只看到最後一張圖像 - 其他圖像也被添加了,但是它們在最上面(最後一張)下面。

如果你想每次用戶點擊一個按鈕時顯示一個新的圖像,那麼你應該有一個實例變量,跟蹤哪個圖像是當前的圖像,並編寫一個方法來更新這個變量並顯示下一張照片。在幾乎所有情況下,像上面這樣的繁忙循環都是錯誤的。

此外,您應該意識到,每次想要顯示新圖像時都不必添加新的UIImageView。您只需更新現有圖像視圖的image屬性即可更改顯示的圖像。

0

我不認爲你需要釋放imageView或wrongButton。只要控制器存在,他們可能希望被保留。

除了這個猜測,我建議我們需要更多的信息。

1

方法'xxx'在主線程上運行嗎?如果是這樣,罪魁禍首是:

while (continueRunningScript == NO) { 
     // Stay here until button is pressed. 
    } 

的iOS使用事件驅動的架構,這是非常不好的做法,阻止主線程像你在這裏做什麼。你的應用程序將無限期地在這裏循環,並停止更新UI,並且不會響應任何按鈕按下或其他事件。這就是爲什麼你的視圖,圖像和按鈕沒有出現。

您需要考慮如何修改您的應用以適應事件驅動架構。

0

當您返回到主UI運行循環時,UIKit只繪製東西。您的代碼在第一張圖像之後和下一張之前不會返回,因此第一張圖像從不顯示。

只在主UI運行循環中檢測/分派事件。由於您的代碼永遠不會從第一個按鈕處理程序返回,因此不會檢測到後續按鈕事件。

相關問題