ios - 无法为 iOS 7 编译 Storyboard

标签 ios storyboard segue ibtool

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

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 时,也没有问题。

最佳答案

注意 - 这一切都源于手动将引用 socket 添加到 UI 元素。不久后我发现我不需要这样做,而不是简单地添加 TAG这就是我所需要的,因为我只想能够以编程方式访问元素以隐藏/显示它(Can I get the element by Tag from iPhone SDK?)。

反正...

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

当我通过编辑 .xib 在 Storyboard 中手动添加引用导出时遇到了这个错误。的 XML 直接,而不是使用接口(interface)生成器。

原因:我想为我拥有的标签添加一个引用导出。但是,当我在界面生成器中使用“新引用 socket ”时,IBOutlet我想没有出现在名单上。因此,我采用了“用锤子敲打它直到它起作用”的方法,并决定在 XML 中手动添加引用导出。

引用导出如下所示:<outlet property="nameOfTheVar" destination="9CH-Ow-gWo" id="8CH-Ow-hWo"/>destination是作为导出的 UI 元素的 ID,id是引用 socket 的唯一 ID。

一个 <outlet>应该是 <connections> 的 child 元素(有道理,它将我的 UI 元素连接到代码中的 IBOutlet 中)。我的 <label>有一个 <connections>元素,所以我在那里添加了 socket 。 这就是导致我的源和目标必须是唯一的错误 .我想它不喜欢作为它的导出元素的子元素的导出。

因此,为了修复错误,我移动了 <outlet>来自 <connections>实际 UI 元素的子元素到 <connections><viewController> 的子元素的那个观点。

这是(高度缩写的)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 - 无法为 iOS 7 编译 Storyboard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30799350/

相关文章:

iOS:如何推送到 DetailView

swift - 在下一个 UI View 出现之前获取用户身份验证

ios - "Terminating app due to uncaught exception ' NSInvalidArgumentException '"

ios - 有没有更简单的方法来替换在 xcode 中设置到 xib 中的所有字体?

ios - UITableViewCell 中的自定义 VoiceOver 操作

ios - 设置为对象时JSON结果为空,但可以打印出结果

ios - 在 iOS 中实现基于位置的服务的最佳实践

ios - 从我的 Storyboard上的另一个 View 获取 tabbarcontroller

iphone - Storyboard iOS MBProgressHUD

ios - 如何将预制 IBAction 连接到我的 Storyboard?