2014-02-18 5 views
0

У меня есть метод prepareForSegue в двух разных VC. Один использует оператор if, а другой предназначен для использования switch. Код практически идентичен, за исключением имен.PrepareForSegue mystery

Это один работает отлично:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
     NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 
    if ([[segue identifier] isEqualToString:@"addActivity"]) 
    { 
     UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
     AddActivityViewController *aavc = (AddActivityViewController *)navController.topViewController; 
     aavc.delegate = self; 
     ListActivity *addedActivity = (ListActivity *)[ListActivity MR_createInContext:localContext]; 
     aavc.thisActivity = addedActivity; 
    } 

Это один дает мне два предупреждения. В первой строке появляется предупреждение «Ожидаемое выражение». На второй строке, я получаю «Использование необъявленной идентификатора 'NavController'

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 
    [SearchSpecs MR_truncateAllInContext:localContext]; 
    [localContext MR_saveToPersistentStoreAndWait]; 

    switch ([sender tag]) 
    { 
     case aVsAButton_tag: 
      UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
      AvsAViewController *aVSaVC = (AvsAViewController *)navController.topViewController; 
      aVSaVC.delegate = self; 
      SearchSpecs *thisSpec = (SearchSpecs *)[SearchSpecs MR_createInContext:localContext]; 
      aVSaVC.currentSpec = thisSpec; 

      break; 

     default: 
      break; 
    } 

} 

Может кто-то пожалуйста, указать на мою ошибку

Благодаря

Edit:.?!

В проблема была устранена всеми ответами, и огромное спасибо всем!

Это мой новый код:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 
    [SearchSpecs MR_truncateAllInContext:localContext]; 
    [localContext MR_saveToPersistentStoreAndWait]; 

    switch ([sender tag]) 
    { 
     case aVsAButton_tag: 
     { 
      UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
      AvsAViewController *aVSaVC = (AvsAViewController *)navController.topViewController; 
      aVSaVC.delegate = self; 
      SearchSpecs *thisSpec = (SearchSpecs *)[SearchSpecs MR_createInContext:localContext]; 
      aVSaVC.currentSpec = thisSpec; 
     } 
      break; 

     default: 
      break; 
    } 

} 

Когда я добавил точку с запятой за предложение третьего ответа, я получил предупреждение, что «Switch случай находится в защищенном объеме» на default: линии. Однако, когда я заключил код case в фигурные скобки, все проблемы испарялись. Очень хорошо, что я помню!

Я хотел бы проверить все ответы, но поскольку все они прибыли одновременно, я надеюсь, что никто не обидится, если я приму верхнюю. +1 для всех, и еще раз спасибо!

+1

Если вы создаете объект в корпусе коммутатора, вы должны использовать: '{}' – Larme

ответ

3

В C/Objective-C, вы не можете объявлять переменные в распределительном заявлении подобного , Если вы хотите объявить переменные для использования в конкретном случае переключателя заявление, вы можете поместить весь код для этого случая в блоке заявление:

switch ([sender tag]) 
{ 
    case aVsAButton_tag: 
    { 
     UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
     AvsAViewController *aVSaVC = (AvsAViewController *)navController.topViewController; 
     aVSaVC.delegate = self; 
     SearchSpecs *thisSpec = (SearchSpecs *)[SearchSpecs MR_createInContext:localContext]; 
     aVSaVC.currentSpec = thisSpec; 
    } 
     break; 

    default: 
     break; 
} 
+1

[Это хорошее объяснение] (http://stackoverflow.com/questions/92396/why-cant-variables-be- statement-in-a-switch-statement), почему вам нужны скобки, когда вы пытаетесь сделать что-то вроде этого. – bdesham

+0

Также в C++ это так: – Jeef

+0

Спасибо за полезную ссылку @bdesham! – rattletrap99

3

Чтобы решить вторую ошибку, попробуйте добавить фигурные скобки в вашем выключателе случае, чтобы определить контекст переменные:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 
    [SearchSpecs MR_truncateAllInContext:localContext]; 
    [localContext MR_saveToPersistentStoreAndWait]; 

    switch ([sender tag]) 
    { 
     case aVsAButton_tag: 
      { 
       UINavigationController *navController = (UINavigationController *)segue.destinationViewController; 
       AvsAViewController *aVSaVC = (AvsAViewController *)navController.topViewController; 
       aVSaVC.delegate = self; 
       SearchSpecs *thisSpec = (SearchSpecs *)[SearchSpecs MR_createInContext:localContext]; 
       aVSaVC.currentSpec = thisSpec; 
      } 
      break; 

     default: 
      break; 
    } 

} 
3

Есть две отдельные проблемы здесь.

Вы можете объявить переменную в C/Objective-C в распределительном-оператора (без необходимости дополнительного { ... } объема), , но не сразу после наклейке.Для решения этой проблемы достаточно , чтобы вставить точку с запятой после метки:

switch (i) { 
    case 0: ; 
     int i; 
     // ... 
     break; 

    default: 
     break; 
} 

Только если вы объявляете Objective-C объекты и компилировать с ARC, то вы должны ввести дополнительный объем:

switch (i) { 
    case 0: { 
     NSObject *obj; 
     // ... 
     } break; 

    default: 
     break; 
} 

Причина в том, что компилятор ARC должен знать точное время жизни t он объектив.