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


89

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个场景)。

有什么建议?

屏幕截图警告

Answers:


50

虽然这个线程很旧,但我没有看到描述对我有用的答案,所以这里...

我遇到了这个错误,对情节提要的直观检查显示,所有视图控制器似乎都已连接到根视图控制器。

我尝试在情节提要中命名所有17个视图控制器(如@bobnoble的回答)。我使用了基于视图控制器长名称的命名约定,例如“ Jobs View Controller”的“ jvc”。当我尝试构建时,我收到一条错误消息,指出其中一个视图控制器具有重复的名称。跟踪下来,我发现我有一个视图控制器的实际副本,恰好堆叠在其双胞胎的顶部。我怀疑这是用户界面实验中的剪切粘贴错误,我没有完全退出。

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


3
这件事也发生在我身上,但我仍然不得不填补众多空缺之一Storyboard ID
Pierre de LESPINAY 2014年

...那么我认为@bobnoble是用√标记的正确答案
SwiftArchitect 2015年

139

在情节提要中,选择每个视图控制器(下图中的红色箭头),然后查看情节提要ID字段(红色椭圆形)。情节提要ID字段均不得为空。当您找到一个罪魁祸首时,那就是罪魁祸首。

在此处输入图片说明


6
嗨,@ bobnoble,谢谢您的回复。一个问题:为什么要为每个场景设置情节提要ID?我不认为这是强制性的,不是吗?我知道如果要以编程方式访问场景,则必须设置ID,但是如果我的所有场景都是通过segue连接的,该怎么办?还是仅仅是好的编程习惯?
Wolfy 2012年

@Wolfy-好的一点,您需要仔细检查每一个,以确保它具有segue或Storyboard ID。
bobnoble 2012年

2
尝试这种解决方案时,我意识到只填写一个特定的内容就Storyboard ID消除了警告
Pierre de LESPINAY 2014年

我不得不UINavigationController使用多个UIViewControllers标识符,并且必须为所有标识符设置一个标识符,即使我从未按标识符调用它们之一。真烦人,寻找一个没人能找到的错误!
亚历克斯·希欧

为我工作。有谁知道为什么会这样吗?似乎非常难以发现-回想起来,给出的错误仅提供了微不足道的线索。我将故事板转换为最新,最棒的版本后才得到它-如果现在需要故事板ID,肯定不是以前需要的,并且自动转换不会处理它。
Josh Sutterfield

30

我只是在一个简单的单场景情节提要板上遇到了这个确切的错误,而要解决此问题,只需检查情节提要中1个视图控制器的“是初始视图控制器”复选框即可。我怀疑在这种情况下,默认情况下Xcode会为您选中此框,但不再这样做。

选中底部的框

                                     

选中该框,确保情节提要中的视图控制器之一完全正确,您应该会很好。


1
谢谢。就是这样!
Eric Chen

20

恐怕您将不得不遍历所有30个对象,并检查它们是否具有情节提要ID或该视图控制器的序列。两者之一是必需的,两者也是一个选项。


5
所有视图控制器都具有其segue或ID之后,错误消息可能仍然存在。在这种情况下,请清洁产品,然后产品将消失。
ReinhardMänner2014年

5
就我而言,在解决错误后,产品清洁不足以消除错误消息。重新启动Xcode后,它消失了。(我没有尝试关闭/重新打开该项目。这可能也起作用。)
JulianSymes,2015年

对我来说也一样-最终您需要停止并重新启动xcode才能消除错误消息。
MusiGenesis '16

8

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

情况I: 如果情节提要中的场景均未标记为“ isInitialViewController”

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

案例二

在某些情况下,您无需在情节提要中拥有InitialViewController。例如:使用多个情节提要板时。

修复:在这种情况下,请确保正确提供了“故事板ID”,并且您使用此ID引用了故事板中要使用的第一个场景。例如:

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

在这种情况下,“ storyboard ID”是必填项。

情况三

您已连接了initialViewController。但是您仍然会收到此警告。这是因为情节提要中的某些场景可能未与“ segue”关联,并且它们也没有“ storyboard id”。扫描您的情节提要,看看是否需要“ segue”。如果缺少,请连接segue。如果不需要序列,请确保您需要提供“ storyboard id”,因为这是从代码中引用场景的唯一方法,如上面的示例代码所示。

希望这可以帮助


案例三-帮助了我。谢谢!
mrGott 2015年

我遇到了一个示例项目,其中包含旧的xib文件。我创建了一个StoryBoard,但我目前很痛苦。.需要将xib转换为storyBoard格式并从那里移动..无法看到创建应用程序场景或菜单的任何方式
。– nyxee

6

您无需Storyboard ID为所有场景设置或UINavigationController

好吧,我大约有50-60个场景,我刚得到这些警告,因此我意识到仅需要设置与segue不相关的controller(Scene)或NavigationController即可Storyboard ID

在此处输入图片说明

您可以看到上图中UINavigationController与segue没有关联,这是该警告的罪魁祸首。

只需为其提供一个Storyboard ID即可删除此警告。


5

我遇到过同样的问题。使用导航和标签栏控制器,我的情节提要板上有很多视图。对我来说,警告您某些视图未连接只是警告。 确保所有视图都以某种方式连接到根视图控制器。我从头开始启动该项目以消除此警告,并且在未连接视图时也注意到了相同的警告。


这对我有帮助。我正在使用超过7.1.1 Swift2。初始StoryBoard必须是根视图控制器。
卢克斯西维(Lukesivi),2015年

3

查找违规场景的最简单方法:

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

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

旁注:有时,对于作为导航控制器的根视图控制器(即初始视图控制器)的场景,XCode会错误地给出此错误。简单的解决方法是为该根视图控制器提供一个Storyboard ID,进行编译(错误应消失),然后删除StoryboardID(不再有错误)。


感谢您的提示“简单修复为该根视图控制器提供了Storyboard ID”。它解决了我的问题。好吧,我需要将“ Storyboard ID”提供给UINavigationController。
Mohd Haider

这使我指向带有主菜单的“应用程序场景”。无法提供情节提要ID。
丹尼尔(Daniel)

2

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

  • .storyboard在项目浏览器中Ctrl-单击,然后选择Open As > Source Code。这将显示情节提要的基础XML。
  • 在这种情况下,警告将明显与XML中与违规场景有关的一行有关。

现在,就我而言,警告特别令人讨厌,因为“违规场景”具有标识符和标记!我可以通过删除场景然后撤消删除来解决此问题。不优雅,但可行。在执行此操作之前,我保存了Storyboard。回想起来,我本该抄写一本,diff然后再写。


2
奇怪的是,这似乎并不一致。在我遇到麻烦的情况下,它奏效了。现在,我正在测试它,并且Source Code视图未显示该错误。因此,里程可能会有所不同。
德米特里·明科夫斯基

我没有找到与此相关的View Controller,但是我删除了它(在XML中,在ID中不起作用)并且警告消失了。
丹尼尔(Daniel)

2

对我来说,不是因为a Storyboard ID或a Segue。我收到此警告是因为尚未设置View Controller's Custom Class

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

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


我刚刚对此做了一些改动。我将情节提要中的错误ViewController与ViewController类进行了匹配,并且将情节提要ID进行了匹配。
文斯·奥沙利文

2

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

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

是初始视图控制器

被检查。瞧!


2

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

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

使用此信息,您可以复制对象id(在本例中为fPh-fe-F5F),并在工作区中搜索此字符串的出现。可以在Main.storyboard文件中找到字符串。双击搜索结果,将打开包含所选场景的Main.storyboard。知道有问题的场景后,您可以通过设置情节提要ID或设置“是Initial View Controller”来轻松解决问题


1

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

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


1
Mohammad,感谢您的答复,但问题是:我应该在哪个场景上设置标识符?我找不到引起警告的场景,这是主要问题。
Wolfy 2012年

1

我遇到了同样的问题,并通过在情节提要ID上放置了所有viewController和NavigationController的任何标识符来解决;该错误将立即消除

请享用!!!


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>

0

我不知道是否尚未提及此问题,但是您可能会收到此警告的另一个原因是,如果您的segue方向错误。例如,在我的项目中,我收到此警告,但实际上所有控制器均已连接。但是,其中之一的说法基本上是试图从孩子那里介绍父母,而不是父母提出孩子。这引起了同样的警告。



0

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


0

我尝试了上述所有方法,但均无济于事。我在IB中正确连接了所有设备,其中只有一个UIViewController被指定为根视图控制器。我没有标识符,但是将它们添加到了所有控制器中。

我可以得到警告消失的唯一方法是,通过执行上述所有操作(包括重新启动计算机和全新构建),然后在git中切换到我项目的无错误分支,然后再次返回。

不能确定是哪个动作修复了它,还是不确定哪些动作组合了,但是这并不是一个干净的方法。这可能是Main.storyboard的副产品,总会在打开后不断变化,这意味着我必须git commit -m "Stupid storyboard"要做的比我想的要多。


0

这是对我有用的东西:

  1. 在文本编辑器中打开情节提要。
  2. 将版本从3.0更改为2.0保存并关闭。
  3. 在Visual Studio中再次打开它。它将自动转换并打开文档。

0

我遇到了同样的错误:对我来说,错误是我没有在故事板上启动视图控制器。

解决该问题后,该警告消失了。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.