无法为 iOS 7 编译 Storyboard

Posted

技术标签:

【中文标题】无法为 iOS 7 编译 Storyboard【英文标题】:Cannot compile Storyboard for iOS 7 【发布时间】:2015-06-12 09:09:26 【问题描述】:

我们有一个使用 Storyboard 的 UIKit 应用程序的 Swift 项目。一切都很好,直到我决定将应用程序的最低部署目标降低到 ios 7。在构建应用程序时,我在 ibtool 中点击了一个断言,它试图编译故事板。错误是这样的:

2015-06-12 11:49:07.216 ibtoold[41058:6974134] [MT] DVTAssertions: ASSERTION FAILURE in /SourceCache/IDEInterfaceBuilder/IDEInterfaceBuilder-7702/InterfaceBuilderKit/Connections/IBConnection.m:182
Details:  Source and destination must be unique
Object:   <IBCocoaTouchStoryboardPushSegue: 0x7fdea9bce8a0>
Method:   -setDestination:
Thread:   <NSThread: 0x7fdea2c07820>number = 1, name = main
Hints: None
Backtrace:
  0  0x00000001015e0147 -[DVTAssertionHandler handleFailureInMethod:object:fileName:lineNumber:assertionSignature:messageFormat:arguments:] (in DVTFoundation)
  1  0x00000001015dfb9f _DVTAssertionHandler (in DVTFoundation)
  2  0x00000001015dfe8e _DVTAssertionFailureHandler (in DVTFoundation)
  3  0x00000001023ff472 -[IBConnection setDestination:] (in IDEInterfaceBuilderKit)
  4  0x00000001023fe5c9 +[IBConnection connectionWithSource:label:andDestination:] (in IDEInterfaceBuilderKit)
  5  0x00000001086aa798 (in IDEInterfaceBuilderCocoaTouchIntegration)
  6  0x0000000108704abb (in IDEInterfaceBuilderCocoaTouchIntegration)
  7  0x0000000102481472 -[IBDocument updateConnectionsAfterEnablingOrDisablingConfigurations] (in IDEInterfaceBuilderKit)
  8  0x0000000102482194 __35-[IBDocument disableConfigurations]_block_invoke (in IDEInterfaceBuilderKit)
  9  0x0000000102481beb -[IBDocument maintainCanvasCentersWhileTransformingCanvasPositions:] (in IDEInterfaceBuilderKit)
 10  0x000000010248209c -[IBDocument disableConfigurations] (in IDEInterfaceBuilderKit)
 11  0x000000010868852c (in IDEInterfaceBuilderCocoaTouchIntegration)
 12  0x0000000102497469 -[IBDocumentAutolayoutManager runBlockInNewArbitrationStackEntryWithBehavior:block:] (in IDEInterfaceBuilderKit)
 13  0x000000010247de2b -[IBDocument modifyViewsInAutolayoutSafeWayDuring:] (in IDEInterfaceBuilderKit)
 14  0x00000001086884e2 (in IDEInterfaceBuilderCocoaTouchIntegration)
 15  0x000000010865d1e5 (in IDEInterfaceBuilderCocoaTouchIntegration)
 16  0x000000010244628f -[IBDocument finishChangingTargetRuntimeInCompiledIntermediateDocument] (in IDEInterfaceBuilderKit)
 17  0x00000001024a5811 __85-[IBDocumentCompiler invokeWithIntermediateDocumentOfTargetRuntime:alwaysCopy:block:]_block_invoke (in IDEInterfaceBuilderKit)
 18  0x00000001024a55a9 -[IBDocumentCompiler invokeWithIntermediateDocument:] (in IDEInterfaceBuilderKit)
 19  0x00000001024a574d -[IBDocumentCompiler invokeWithIntermediateDocumentOfTargetRuntime:alwaysCopy:block:] (in IDEInterfaceBuilderKit)
 20  0x00000001026aa61c -[IBStoryboardDocumentCompiler compileWithOptions:error:] (in IDEInterfaceBuilderKit)
 21  0x00000001024a5937 +[IBDocumentCompiler compileContentsOfDocument:options:error:] (in IDEInterfaceBuilderKit)
 22  0x0000000102460550 __47-[IBDocument compiledPackageWithOptions:error:]_block_invoke (in IDEInterfaceBuilderKit)
 23  0x0000000102498ee5 -[IBDocumentAutolayoutManager assertIfArbitrationIsScheduledDuring:] (in IDEInterfaceBuilderKit)
 24  0x00000001024604a7 -[IBDocument compiledPackageWithOptions:error:] (in IDEInterfaceBuilderKit)
 25  0x00000001013e9f0a (in ibtoold)
 26  0x00000001013e6b40 (in ibtoold)
 27  0x00000001013e9370 (in ibtoold)
 28  0x00000001013ef233 (in ibtoold)
 29  0x00000001013ef7b0 (in ibtoold)
 30  0x00000001013ef683 (in ibtoold)
 31  0x00000001013de60a (in ibtoold)
 32  0x00000001013eee2c (in ibtoold)
 33  0x00000001013ee074 (in ibtoold)
 34  0x00007fff9289f5c9 start (in libdyld.dylib)
 35  0x0000000000000002
Command /Applications/Xcode.app/Contents/Developer/usr/bin/ibtool failed with exit code 255

我检查了所有的 segues(它们很多),但我似乎没有发现有什么问题。此外,当最小部署目标是 8.x 时,也没有问题。

【问题讨论】:

您确定删除 DerivedData 了吗?它可能只是剩下的。 是的,我删除了 DerivedData 并且没有效果。 嗯...你能发布你的segues的结构吗?可能是故事板的屏幕截图? 这个应用非常复杂,有 50 多个视图控制器和很多 segue。我想知道这个错误是什么意思:详细信息:源和目标必须是唯一的对象: 方法:-setDestination:线程:number = 1,name = main 提示:无 我猜测你有相同标识符的segues,除此之外,很难说...... 【参考方案1】:

注意 - 这一切都源于手动将引用插座添加到 UI 元素。不久之后,我发现我不需要这样做,并且我只需要添加一个TAG,因为我只是希望能够以编程方式访问该元素以隐藏/显示它(Can I get the element by Tag from iPhone SDK?)。

无论如何...

不知道这是否一定适用于 OP,但也许它会帮助 googler:

当我手动通过直接编辑.xib 的XML 而不是使用界面生成器在情节提要中添加引用出口时遇到了这个错误。

原因:我想为我拥有的标签添加一个引用出口。但是,当我在界面构建器中使用“新引用插座”时,我想要的 IBOutlet 并没有出现在列表中。因此,我采用了“用锤子敲打直到它起作用”的方法,并决定在 XML 中手动添加引用出口。

引用出口如下所示: &lt;outlet property="nameOfTheVar" destination="9CH-Ow-gWo" id="8CH-Ow-hWo"/&gt;

destination 是作为插座的 UI 元素的 ID,id 是引用插座的唯一 ID。

&lt;outlet&gt; 应该是 &lt;connections&gt; 元素的子元素(有道理,它将我的 UI 元素连接到代码中的 IBOutlet 中)。我的&lt;label&gt; 有一个&lt;connections&gt; 元素,所以我在那里添加了插座。 这就是导致我的来源和目的地必须是唯一的错误的原因。我想它不喜欢作为它的出口元素的子元素的出口。

所以,为了修复错误我将 &lt;outlet&gt; 从作为实际 UI 元素的子元素的 &lt;connections&gt; 移动到作为子元素的 &lt;connections&gt; 元素&lt;viewController&gt; 的那个观点。

这是(高度缩写的)XML:

<viewController>
    <layoutGuides />
    <view>
        <subviews>
            <label id="9CH-Ow-gWo">
                <connections>
                    <!-- dont put the outlet here -->
                </connections>
            </label>
        </subviews>
    </view>
    <connections>
        <!--put the outlet here! -->
        <outlet property="nameOfTheVar" destination="9CH-Ow-gWo" id="8CH-Ow-hWo"/>
    </connections>
</viewController>

【讨论】:

以上是关于无法为 iOS 7 编译 Storyboard的主要内容,如果未能解决你的问题,请参考以下文章

ios 7 TableViewController 单元格无法完全显示

MagicalRecord 示例应用程序无法在 Xcode 7 中编译

在 iOS 7 之前的项目中编译警告“不兼容的指针类型初始化 'UIImage *' 使用类型为'CIImage * _Nullable”的表达式

无法构建或编译 phonegap 2.1

Swift:从 iOS 7 编译存档时出现分段错误

iOS 7 状态栏透明度