PrepareForSegue神秘

我在两个不同的VC中有一个prepareForSegue方法。 一个使用if语句,另一个使用switch 。 代码实际上是相同的,除了名称。

这个工作正常:

 - (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; } 

这个给了我两个警告。 在第一行,我得到一个“预期的expression”警告。 在第二行,我得到“使用未声明的标识符”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; } } 

有人可以指出我的错误吗?

谢谢!

编辑:

所有答案都解决了问题,非常感谢!

这是我的新代码:

 -(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; } } 

当我根据第三个答案的build议添加了分号时,我收到警告:“切换大小写在保护范围内”在default:default: 。 但是,当我把case代码括在花括号里时,所有的问题都消失了。 非常好的事情让我记住!

我会对所有的答案进行绿色检查,但是因为它们都是同时到达的,所以我希望如果我接受这个答案,就不会有人受到冒犯。 +1,再次感谢!

在C / Objective-C中,你不能像这样在switch语句中声明variables。 如果你想声明一个switch语句的特定情况下使用的variables,你可以把这个case的所有代码放到一个语句块中:

 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; } 

要解决第二个错误,请尝试在开关箱中添加大括号以定义variables的上下文:

 -(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; } } 

这里有两个独立的问题。

你可以在C / Objective-C中声明一个switch语句中的variables(不需要额外的{ ... }作用域),但不能立即跟在一个标签之后 。 为了解决这个问题,在标签后面插入一个分号就足够了:

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

只有在声明Objective-C 对象并使用ARC进行编译时,才需要引入一个额外的范围:

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

原因是ARC编译器需要知道对象的精确生命周期。