2011-05-07 120 views
0

的使用我有一個看起來像這樣的方法:的UIViewController:未聲明的標識符

- (void)testMethod:(int)myNumber { 
    switch (myNumber) { 
     case 0: { 
      MyViewController0 *controller = [self.myViewControllers objectAtIndex:myNumber]; 
      if ((NSNull *)controller == [NSNull null]) { 
       controller = [[MyViewController0 alloc] initWithNibName:@"MyView0" bundle:nil]; 
       controller.aVariable = self.myVariable; 
       [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller]; 
       [controller release]; 
      } 
      if (controller.view.superview == nil) { 
       // do some stuff with controller ... 
      } 
      break; 
     } 
     case 1: { 
      MyViewController1 *controller = [self.myViewControllers objectAtIndex:myNumber]; 
      if ((NSNull *)controller == [NSNull null]) { 
       controller = [[MyViewController1 alloc] initWithNibName:@"MyView1" bundle:nil]; 
       [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller]; 
       [controller release]; 
      } 
      if (controller.view.superview == nil) { 
       // do some stuff with controller ... 
      } 
      break; 
     } 
     // ... 
    } 
} 

我的問題涉及到這些線路,這都是一樣的:

if (controller.view.superview == nil) { 
    // do some stuff with controller ... 
} 

所以,我想刪除這些線在開關盒內,並將它們放在方法的末尾。

問題是,如果我這樣做,我得到的錯誤:Use of undeclared identifier controller。 我認爲這是因爲有可能controller可能保持未申報(如果沒有成功)。

但我能做些什麼來避免把這些線在每一個case語句,可我反而把它一旦在方法的結束?

回答

1
- (void)testMethod:(int)myNumber { 
    UIViewController* controller = nil; 

    switch (myNumber) { 
     case 0: { 
      controller = [self.myViewControllers objectAtIndex:myNumber]; 
      if ((NSNull *)controller == [NSNull null]) { 
       controller = [[MyViewController0 alloc] initWithNibName:@"MyView0" bundle:nil]; 
       ((MyViewController0*)controller).aVariable = self.myVariable; 
       [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller]; 
       [controller release]; 
      } 

      break; 
     } 
     case 1: { 
      controller = [self.myViewControllers objectAtIndex:myNumber]; 
      if ((NSNull *)controller == [NSNull null]) { 
       controller = [[MyViewController1 alloc] initWithNibName:@"MyView1" bundle:nil]; 
       [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller]; 
       [controller release]; 
      } 
      break; 
     } 
     // ... 
    } 

    if(!controller) { 
     //todo 
    } else 
    if (!controller.view.superview) { 
       // do some stuff with controller ... 
    } 


} 
+0

這工作正常!謝謝。 – Tim 2011-05-07 13:59:18

1

這是因爲你只在那些特定的範圍聲明變量,你要使用它它聲明的範圍之外(你不能,那是範圍的整點)。

您在切換之前需要這樣的:

UIViewController* controller = nil; 

然後在你的case語句你只是分配給現有controller變量,而不是在該範圍內宣佈它的。

+0

是的,我也查了這一點,但我有兩個局部變量'controller',它使用了'UIViewController'代替MyViewControllerX'的'。所以我聲明瞭這個變量的兩倍。刪除'controller'前面的'MyViewControllerX *',我遇到了這樣一行'controller.aVariable = self.myVariable;'因爲它不知道'controller.aVariable'是否存在:'Property aVariable not found on UIViewController類型的對象*' – Tim 2011-05-07 13:53:24