2011-11-15 52 views
1

我正在整理我的第一個應用程序,試圖將按鈕按下事件組合到一個方法調用中,並使用按鈕的Tag來查看哪個按鈕被點擊。然而,switch語句似乎不喜歡我努力的Alloc視圖控制器裏面iOS4 - 使用switch語句處理按鈕按下

#import "NewsViewController.h" 
... 
... 
- (IBAction)contentPressed:(id)sender 
    { 
     // check which button was pressed 

     UIButton *contentBtn = (UIButton *)sender; 

     switch (contentBtn.tag) 
     { 
      case 1: 
       NewsViewController *controller = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:nil]; 

       [self.navigationController pushViewController:controller animated:YES]; 
       [controller release]; 
      break; 
     } 
    } 

它拒絕承認控制器 - 我得到和「意外接口名稱「未聲明的標識符‘控制器’的使用」 NewsViewController,預期標識符「在我正在執行alloc的行上。

在我嘗試將按鈕的各個IBActions合併爲一個之前,所有工作都已經完成。任何人都對此有所瞭解?

回答

1

您不能在case語句中直接聲明變量。您必須在switch語句之前聲明變量NewsViewController *controller或用大括號括住您的完整情況。這源於這樣一個事實,即案件陳述具有一種稱爲落空的機制,其中一個案件不會在break;結束,將繼續到下一個案例,這會給變量聲明帶來困難。如果你不喜歡這樣,你應該罰款:

switch (contentBtn.tag) 
    { 
     case 1: 
     { 
      NewsViewController *controller = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:nil]; 

      [self.navigationController pushViewController:controller animated:YES]; 
      [controller release]; 
      break; 
     } 
    } 
+0

這兩個答案不同之處在於'break;'語句的位置 - 大括號內部或外部。這是否重要? – jrturton

+0

它應該沒有什麼區別,因爲'break'語句總是會打破下一個''for',''while'或'case'的外層。 –

+0

太棒了,感謝您的快速響應! – Dave

1

爲了聲明交換機switch語句中變量的代碼部分必須有它自己的範圍由大括號包圍。

switch (contentBtn.tag) 
{ 
    case 1: 
    { 
     NewsViewController *controller = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:nil]; 

     [self.navigationController pushViewController:controller animated:YES]; 
     [controller release]; 
    } 
    break; 
} 
+0

這兩個答案僅在「break;'語句的位置 - 花括號內部或外部不同。這是否重要? – jrturton