NSInvalidArgumentException - 接收者没有具有标识符的segue

33
我已经尝试了很多方法,但没有一个有效的。我想在两个视图控制器之间进行segue,从一个tableViewController到另一个tableViewController。Segue与顶层视图连接,而不是表格视图单元格。在Xcode中设置的标识符与代码中使用的标识符相同(复制并粘贴)。昨晚它还可以正常工作,但现在似乎无法实现segue而不崩溃。
以下是调用segue的方法:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    self.photoList = [FlickrFetcher photosInPlace:[self.topPlacesList objectAtIndex:indexPath.row] maxResults:50];
    NSLog(@"photolist %@", self.photoList);

    NSLog(@"here");

    [self performSegueWithIdentifier:@"segue1" sender:self];
    NSLog(@"here");
}


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"segue1"])
    {
        PhotosTableViewController *photosTVC = segue.destinationViewController;
        photosTVC.photoList = self.photoList;
    }
}

这是错误报告:

2012-08-08 15:28:39.093 Top Places[512:f803] *Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (PlacesTableViewController: 0x6887ff0) has no segue with identifier 'segue1'' First throw call stack: (0x13c0052 0x1551d0a 0xde24b 0x3efd 0xa771d 0xa7952 0x92f86d 0x1394966 0x1394407 0x12f77c0 0x12f6db4 0x12f6ccb 0x12a9879 0x12a993e 0x17a9b 0x2778 0x26d5) terminate called throwing an exception

这里是故事板的截图http://s14.postimage.org/66wf13q4h/Screen_Shot_2012_08_08_at_3_22_10_PM.png


6
嘿!我修好了!1. 确保在Xcode中选择了正确的Storyboard(如果你重命名了Storyboard,在项目概要中也需要更改)。然后在模拟器上删除应用程序并重新启动。 - James Traimory
8
删除应用程序是一个解决方案!谢谢! - k06a
4
同时请检查您是否对故事板进行了本地化或修改。我有两个版本(一个在en.lproj/中,另一个在es.lproj/中),而正在使用的版本(en)与我修改的版本(es)不同。 我只需从项目中移除,删除未使用的版本,然后重新添加“好”的版本即可。 - Ramon Poca
哇,这个 bug 真是让人头疼!我也在更改 segue 的位置后从模拟器中删除了应用程序,现在它可以正常工作了。 - ThaDon
感谢 @RamonPoca,您的提示解决了我的大问题。 - derjohng
显示剩余2条评论
8个回答

50
我能够通过在 Xcode 的 "产品" 菜单下运行 "清除",并在模拟器中重置内容和设置来解决它。

6
我甚至不需要在模拟器上做任何事情,只需要执行“清理”操作就解决了我的问题。 - Mark Amery
1
我认为问题在于xib和storyboard被缓存在设备上,因此您需要重置所有这些东西。 - Sebastian Boldt

6

我也遇到了同样的问题。在我的初始化器-(id)initWithCoder:(NSCoder *)aDecoder中,我使用了self = [super init];,但正确的应该是self = [super initWithCoder:aDecoder];。修复后,一切都按照预期正常工作。


4
我遇到了同样的问题,苦苦思索数小时。Stackmonster的答案解决了我的问题(重命名stroyboard),但我不明白为什么这样做可以解决问题。
我发现当我更改storyboard上的项目(添加标签或更改背景颜色)时,在模拟器中没有反映出来 - 我并没有使用在Xcode中看到的storyboard,而是一个旧版本的storyboard。 我必须在项目导航器中重命名storyboard,还要在info.plist(支持文件中)中重命名它,然后我的标签就出现了,并且背景颜色应用了,segue也可以工作了。
我不知道为什么storyboard的更改没有生效,但它让我花费了很多时间去查找。我在博客上看到很多开发人员都有同样的问题。

3

我已经解决了!1. 确保在Xcode中选择正确的Storyboard(如果你重命名了Storyboard,请在项目摘要中更改)。然后删除模拟器上的应用程序并重新启动。


0

我曾经遇到过一个反向跳转的问题。最终发现当我在故事板上替换了一个视图控制器时,我丢失了它的标识符。我通过在文档大纲(故事板侧边栏)中点击反向跳转,然后在属性检查器中添加标识符来重新添加它。

如果其他方法都不起作用,至少在反向跳转方面,你可以调用

[self dismissViewControllerAnimated:YES completion:nil];

0

我遇到了同样的问题,因为我将新的VC作为另一个视图控制器的子类。它应该是UIViewController或UITableViewController的子类。检查头文件是否导入了UIKIT。


0

我尝试了所有列出的方法,但都没有成功。最后有效的方法是创建一个新的segue到一个新的视图,然后使用它,运行它,然后再创建一个segue返回到旧视图。


0
在Interface Builder中,您需要将segue标识符设置为segue1,这是连接到您的视图控制器的segue。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接