如何纠正我的.h文件将其IBOutlets链接到另一个项目的XIB文件?

13
这对我来说真是一次“什么鬼?”的时刻。
我从另一个项目中复制了一些类,包括复制和粘贴代码和一些UIBuilder组件。 没有被复制的是XIB文件(我从XIB到storyboard)。
我的tab / swipe识别器没有激活,当我深入研究时,我唯一发现的能够解释这个问题的是,不知何故,我正在钩住XIB文件。(当我点击头文件中的IBAction / IBOutlet行旁边的小按钮时,它显示我连接了storyboard和xib文件)。
我找不到任何地方引用那个文件,它只是以某种神奇的方式在Xcode中被识别。 我不知道该怎么办,如何解决这个问题。
有人有什么想法吗?
编辑:真正让人恼火的是,在检查我的文件列表时,该文件似乎没有出现在我的文件列表中,我不能仅以此方式删除引用。而且由于它正在引用原始项目中的文件,我不能只删除它。(在任一项目中进行更改都会导致两个项目中的更改;他们出于某种原因都使用相同的xib文件)。我应该能够简单地删除对xib文件的引用,但我找不到引用。

现在我遇到了同样的问题,我只是将一个xib从原始项目复制并粘贴到我正在工作的修改后的项目中(它是同一个项目,但我只是使用旧副本进行比较或其他操作)。现在头文件指向一个我在项目中没有的xib,而新的xib没有这些连接。我不确定如何解决这个问题。 - Juancarlos Rodríguez
即使我尝试了以下解决方案,我仍然遇到这个问题。每次重新打开两个项目时,连接都会恢复... - Jacob
我也是。这是一个相当荒谬的问题。 - Siriss
@Jacob(和Siriss),让我建议你们删除第一个项目。或者,至少使用Finder在与XCode完全隔离的方式下物理更改其位置(以便它无法尝试还原它们)。 - RonLugge
4个回答

17
如果您将视图控制器代码从一个项目复制到另一个项目中,您会注意到一个奇怪的事情发生在outlet上。它引用了第一个项目中的视图,而您从未连接任何outlets。

enter image description here

如果您左键单击小圆圈并单击引用链接,甚至可以进入另一个项目中的故事板视图。试图弄清楚如何消除此引用可能会让您发疯。
好消息是,您真的没有什么需要修复的。您没有复制某些深层、难以找到的引用链接。Xcode只是因为在两个项目中视图控制器和插座名称相同而感到困惑。基本上忽略那个小圆圈所说的内容。您可以关闭第一个项目,Xcode最终会解决问题。右键单击故事板中的视图,查看当前项目中实际存在的引用插座。(有关更多详细信息,请参见我的更完整的回答。)
无需删除派生数据。那也无法解决问题。只需再次尝试同时打开两个项目,您将获得相同的奇怪行为。
我找出这个问题的方法是分别创建两个新项目,其中包含具有相同名称和引用插座名称的视图控制器。我从未复制过任何东西,但Xcode显示一个正在引用另一个。就像我说的,忽略那个小圆圈。

谢谢你的安慰,但这仍然让我感到烦恼。如果你只是创建一个不同名称的新类,那么这些问题会消失吗? - Ethan Parker
@EthanParker:是的,只要类名或插座名不同,Xcode 就不会混淆。 - Suragch

13

我曾经遇到过同样的问题。解决方法是关闭这两个项目,删除它们的派生数据,然后重新打开目标项目。

我同意,这是一个很疯狂的问题。


这样就解决了。但是,如果现在重新打开原始项目,链接将重新出现... - Kitetaka
删除两个项目的派生数据文件夹解决了我的问题。 - Shantanu
1
正如Alex Zavatone的评论所说,重新打开与头文件链接的项目后,问题将会再次出现。 - AechoLiu

3
我相信这个问题可能会发生,我通过删除XCode的Derived data文件夹中的内容来解决它。
我只想添加如何删除这些文件的步骤:
  1. 不要删除DerivedData文件夹。
  2. 转到偏好设置 (Command ,) > 位置选项卡
  3. 在Derived Data上,你将看到路径,点击右箭头(将在Finder中打开该位置)
  4. 关闭XCode
  5. 选择DerivedData文件夹中的所有文件(不要选择父文件夹)并(Command Delete)或移动到垃圾桶,然后清空垃圾桶
  6. 打开项目,完成
希望能有所帮助。

2
实际上,如果您重新打开与标题链接的项目,则仍将在其他项目中看到与故事板的连接。即使退出并重新启动Xcode。 - Alex Zavatone
对我来说非常好用!! - Scooter
1
这在我的xcode 7.0又发生了,我完全忘记了这个解决方案,花了很多时间搜索尝试解决问题,最终偶然间再次发现这个解决方案,并看到我之前留下的评论说这是一个绝妙的答案。太棒了。 - Scooter

1

除非xib文件在项目中,否则它不应该有链接。

xib文件连接到.h文件,而不是反过来。

您可能需要删除Storyboard中的连接并重新连接它们。

还要确保Storyboard是启动的UI,并且导航堆栈上的项目实际上是Storyboard页面。但是,您应该能够同时将Storyboard和xib文件连接到类。您只不能在单个UI组件中将一个IBOutlet连接到多个对象(例如,Storyboard上的两个按钮不能都连接到@property IBOutlet UIButton *myCurrentButton,您必须为每个连接拥有单独的IBOutlet。另一方面,任意数量的操作可以连接到IBAction。这就是为什么每个操作都会得到(id) sender的原因。

我不知道这是否完全符合您的经验,但我希望理解能够帮助您调试您的问题。


1
你说的内容证实了我大部分的困惑。最终我删除了临时文件,并重新定位了第二个项目。这破坏了与第二个项目中文件的连接,但是,不幸的是,它并没有解决实际问题。结果发现问题出在其他地方的一个漏洞上。 - RonLugge
您可以单击连接气泡并选择与该连接相关的xib文件,在Xcode中打开它。也许它实际上是您项目的一部分,这就是为什么它出现的原因。您可以尝试删除DerivedData文件夹。右键单击目标并在Finder中显示,然后上移树形结构以到达DerivedData文件夹以便删除。然后您将需要清理项目并重新构建。 - The Lazy Coder
点击气泡是我确定这个项目从外部项目引用了一个文件的方式。结果发现移动那个文件夹只是暂时性地破坏了引用,一旦我把项目移回去,引用就恢复了。你能更好地解释一下你的派生数据解释吗?(我通常会从组织者中删除派生数据...) - RonLugge
没问题。很高兴它被解决了。顺便说一下,我经常需要删除DerivedData,所以把它放到我的项目文件夹中并从Finder中删除更方便。我希望苹果能解决这个问题,但删除它可以解决很多问题,包括自动完成。您可能想要检查Xcode >首选项>位置。您可以将其放在任何地方,而不必寻找它。 - The Lazy Coder
3
实际上,内置了一种快速简便的方式——在组织者中的项目详情中,有一个简单的“删除派生数据”按钮。 - RonLugge
显示剩余3条评论

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