Xcode:“由于缺少入口点,场景无法访问”,但无法找到它

时间:2012-11-23 14:26:02

标签: ios xcode storyboard warnings

Xcode 4.5.2给了我以下警告:

Unsupported Configuration    
Scene is unreachable due to lack of entry points and does not have an identifier 
for runtime access via -instantiateViewControllerWithIdentifier:.

不幸的是我无法确定有罪的场景。在“问题导航器”中选择警告不会突出显示故事板中的任何内容。我有一个相当复杂的故事板(30多个场景)。

有什么建议吗?

Screenshot for warning

21 个答案:

答案 0 :(得分:139)

在故事板中,选择每个视图控制器(下图中的红色箭头)并查看故事板ID字段(红色椭圆)。 Storyboard ID字段都不应为空。当你找到一个,那就是罪魁祸首。

enter image description here

答案 1 :(得分:50)

虽然这个帖子已经老了,但我没有看到一个答案描述对我有用的东西,所以这里就是......

我有这个错误,故事板的视觉检查显示所有视图控制器似乎都连接到根视图控制器。

我尝试在故事板中命名所有17个视图控制器(如@ bobnoble'答案)。我使用了基于视图控制器的长名称的命名约定,例如" JVC" for" Jobs View Controller"。当我尝试构建时,我收到一条错误消息,指向其中一个视图控制器具有重复的名称。跟踪事情,我发现我的视频控制器的实际重复正好堆叠在它的双胞胎之上。我怀疑它是用户界面实验造成的剪切和粘贴损坏,我没有完全退出。

无论如何,删除未连接的双胞胎解决了我的问题。之后,我删除了所有VC名称,因为它们未在代码中引用。

答案 2 :(得分:28)

我只是在一个简单的单场景故事板上遇到了这个确切的错误,而我所要做的就是检查故事板中1视图控制器的“是初始视图控制器”复选框。我怀疑Xcode在这种情况下默认为你检查这个框,但不再这样。

Check the box at the bottom

选中故事板中的一个视图控制器的复选框,你应该很好。

答案 3 :(得分:20)

我担心你将不得不浏览所有30个,并检查他们是否有故事板ID或视图控制器的segue。其中一个是必需的,两者都是一种选择。

答案 4 :(得分:8)

在以下情况中可能会发生此问题:

案例I: 如果故事板中的任何场景都没有标记为“isInitialViewController”

修正: 识别根视图控制器并在SB中将其标记为“isInitialViewController”。 在这种情况下,故事板ID不是强制性的。

案例II

在某些情况下,您可能不需要在故事板中使用initialViewController。例如:使用多个故事板时。

修正: 在这种情况下,请确保正确给出“storyboard id”,并使用此ID引用故事板中使用的第一个场景。例如:

UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"MyStoryBoardName" bundle:nil];
MyViewController *myViewController = (MyViewController *)[myStoryBoard instantiateViewControllerWithIdentifier:@"MyViewControllerId"];

在这种情况下,“storyboard id”是强制性的。

案例III

您已连接initialViewController。但是你仍然得到这个警告。 这是因为故事板中的某些场景可能与“segue”无关,而且它们没有“storyboard id”。 扫描您的故事板,查看是否需要“segue”。如果缺少segue,请将其连接起来。 如果不需要segue,请确保您需要提供“storyboard id”,因为这是从代码中引用场景的唯一方法,如上面的示例代码所示。

希望这有帮助

答案 5 :(得分:6)

您无需为所有场景设置Storyboard IDUINavigationController

我有大约50-60个场景,我刚收到这些警告,因此我意识到只有与segue无关的控制器(Scene)或NavigationController需要设置Storyboard ID

enter image description here

你可以看到上面的图片UINavigationController与segue没有联系,这是该警告的罪魁祸首。

只需给它一个故事板ID即可删除此警告。

答案 6 :(得分:5)

我有同样的问题。我的故事板上有很多关于导航和标签栏控制器的观点。对我来说,这只是一个警告,让你知道有些观点没有关联。 确保所有视图都以某种方式连接到根视图控制器。我从头开始这个项目以消除此警告,并在未连接视图时注意到相同的警告。

答案 7 :(得分:3)

查找有问题的场景的最简单方法:

转到问题导航器(在左侧面板中,搜索按钮旁边),然后双击错误。将弹出一个窗口,其中包含以窗口中间为中心的违规场景。

(这实际上是正确的 - 双击任何错误通常会导致弹出窗口包含错误居中 - 一个巧妙的小技巧!)

旁注:有时,XCode会错误地为导航控制器(即初始视图控制器)的根视图控制器的场景提供此错误。简单的修复是为这个根视图控制器提供一个Storyboard ID,编译(错误应该消失),然后删除storyboardID(不再出错)。

答案 8 :(得分:2)

使用Xcode 7,可以轻松处理。无需手动浏览所有场景即可找到有问题的场景。 首先转到报告导航器,您可以在其中获取有关已知问题的更多详细信息。 问题描述可能如下所示:

Base.lproj / Main.storyboard: fPh-fe-F5F :警告:由于缺少入口点而无法访问场景,并且没有通过-instantiateViewControllerWithIdentifier运行时访问的标识符:。< / p>

使用此信息,您可以复制对象ID,在这种情况下,它是 fPh-fe-F5F ,并搜索工作区以查找此字符串的出现。字符串将在Main.storyboard文件中找到。双击搜索结果,将打开Main.storyboard并选择场景。一旦您知道有问题的场景,您可以通过设置故事板ID或设置“是初始视图控制器”轻松解决问题

答案 9 :(得分:2)

我今天来到了这个问题。我正在使用Xcode 6.3,OP问题的答案现在非常简单:

选择您希望成为第一个的View Controller,显示Attributes Inspector,并在View Controller部分下,确保

是初始视图控制器

已选中。瞧!

答案 10 :(得分:2)

对我来说,这不是因为Storyboard IDSegue。我收到此警告是因为我没有设置View Controller's Custom Class

选择View Controller上的Storyboard,然后在Utilities Pane中,选择Identity Inspector图标。在Custom Class下,查看Class字段内的值。

如果它只是说UIViewController,那么您需要输入类名。这将是构成自定义.h子类的.mUIViewController文件的名称。

答案 11 :(得分:2)

查看导致此问题的控制器或场景的最简单方法是:

  • 按住Ctrl键并单击Project Navigator中的.storyboard,然后选择Open As > Source Code。这将打开Storyboard的基础XML。
  • 在此视图中,警告将与XML中与违规场景相关的一行明确相关。

现在,在我的情况下,警告特别令人讨厌,因为“违规的场景”有一个标识符和一个segue!我能够通过删除场景然后撤消删除来解决问题。不优雅,但工作。在这之前我保存了我的故事板。回想起来,我应该制作一份副本并diff'd在之前。

答案 12 :(得分:1)

我遇到了同样的问题,并且在故事板ID上解决了所有viewController和NavigationController的任何标识符;错误将立即删除

享受!!!

答案 13 :(得分:1)

您只需设置标识符即可。在右窗格的属性检查器上,您将找到一个名为“Identifier”的字段。只需在其中放入任何字符串,这应该可以正常工作

您可以单击导航控制器,然后在属性检查器下单击“是初始视图控制器”按钮,这也应该有效。

答案 14 :(得分:0)

我不知道是否还没有提到这个问题,但是你可以得到这个警告的另一个原因是你有一个错误的方向。例如,在我的项目中,我收到了此警告,但我的所有控制器实际上都已连接。然而,其中一个人有一个segue,它基本上是试图让孩子的父母而不是孩子的父母。这引起了同样的警告。

答案 15 :(得分:0)

当我在Storyboard中有一个没有设置任何内容的UIViewController时,我收到了这个警告。 我通过设置Storyboard ID来避免此警告。

答案 16 :(得分:0)

我有同样的问题,但我意识到我正在使用容器视图而不是删除默认视图控制器我删除了它的segue.So视图控制器保留在故事板中,警告也是如此。因此,如果容器视图的默认视图控制器在您不需要时未正确删除,则会出现警告弹出的情况之一。

答案 17 :(得分:0)

我尝试了上述所有内容无济于事。我在IB中正确连接了所有内容,只有一个UIViewController指定了根视图控制器。我没有标识符,但将它们添加到我的所有控制器中。

我能让警告消失的唯一方法是通过执行以上所有操作(包括计算机重启和干净构建)然后切换到git中的项目的无错误分支试。

不确定哪个操作修复了它,或者哪个操作组合,但它本身并不是干净的构建。这可能是Main.storyboard的副产品,总是在简单打开时改变,这意味着我必须经常git commit -m "Stupid storyboard"

答案 18 :(得分:0)

也许这个XQuery会帮助你找到那些讨厌的场景

for $i in .//scene/objects/*[1][not(@storyboardIdentifier) or @storyboardIdentifier= '']/@id      (: find every scene that has an empty storyboardIdentifier :)
where count(.//segue[@destination= $i])= 0 and $i!= ./document/@initialViewController             (: filter the results to the scenes that are not destinations of a segue and exclude the initialViewController :) 
return ($i, $i/../@customClass)                                                                   (: return the storyboard-id and the customClass, if any :)

如果您安装了xqilla,则可以将查询保存到文件中并像

一样使用它
xqilla <xqueryfile> -i <path to your storyboard>

答案 19 :(得分:0)

这对我有用:

  1. 在文本编辑器中打开故事板。
  2. 将版本从3.0更改为2.0保存并关闭它。
  3. 在visual studio中再次打开它。它会自动转换并打开文档。

答案 20 :(得分:0)

简单地给所有MVC一个故事板ID对我有用。