Xcode 8-IB Designables-无法呈现和更新自动布局状态,代理崩溃


167

我最近升级到Xcode 8,并且Storyboard出现问题。

如果我打开项目但没有打开情节提要,它将编译并运行良好。打开情节提要板后,出现有关IB Designables的多个错误,如下所示。

在此处输入图片说明

这些视图是唯一使用自定义视图的视图,TextFieldEffects也是BEMCheckbox我使用Cocoapods导入的视图。


也许检查您正在使用的Pod的存储库,看看此问题在其他用户中是否普遍存在?
Zolnoor

有任何相关答案吗?
Mohsin Khubaib Ahmed

1
你们找到任何解决方法了吗?

请注意,问题可能是您需要嵌入式库的FAT BUILD。在我的示例中,我嵌入了Swifter。自然,您手头上有一个胖胖的版本(用于开发-模拟器/电话)和一个仅电话的版本(对于应用程序商店,仅用于电话),当需要提交给TestFlight等时,您只需交换到仅电话的版本即可。在项目中有仅电话的图书馆!h!换成“正确”的胖子就可以解决问题。
Fattie

Answers:


179

您可以尝试以下方法之一找出原因:

  1. IBDesignablesAgentCocoaTouch在此目录中查找日志: ~/Library/Logs/DiagnosticReports并查看原因。

注意:对于使用Catalina的用户:寻找 IBDesignablesAgent-iOS_<DATE>-<MAC_NAME>.crash

  1. @IBDesignable UIView在情节提要中选择时,转到“编辑器”->“调试选定的视图” ,然后查看堆栈跟踪。

  2. 删除派生数据文件夹。

    Xcode Preference -> Location -> Derived Data
    /Users/YourMacName/Library/Developer/Xcode/DerivedData
  3. 清理项目Shift + Command + Alt + K

  4. 建立您的专案Command + B


35
使用这种方法,我能够找出原因是Fatal error: Use of unimplemented initializer 'init(frame:)' for class 'TestIBKit.Button'。我不知道该IBDesignablesAgentCocoaTouch流程调用init(frame:),而不是init?(coder aDecoder:)
Yevhen Dubinin

5
@YevhenDubinin谢谢,这对我有所帮助。在实现init(frame:)UIButton子类之后,一切都很好
多啦A梦

2
这解决了我的问题,但是我必须在删除派生数据之前退出xCode
Husam,

2
最佳答案的init(帧:)是常见的问题
米哈尔Ziobro

1
退出xcode并清除DerivedData。它解决了问题。
Mubashar

80

我通过执行以下操作解决了该问题:

  1. 转到File > Workspace settings
  2. 单击“派生数据”旁边的右小箭头。这将在DerivedData文件夹位置打开Finder应用程序。
  3. 进入DerivedData文件夹,然后删除与您的项目相对应的文件夹。
  4. 退出Xcode,然后重新打开它。
  5. 清理您的项目shiftcommandk
  6. 建立你的项目commandb
  7. 打开情节提要。
  8. 转到Editor > Refresh all views

更新

有时只是直接去Editor > Refresh all views上班。如果Refresh all views已禁用,请退出Xcode,然后重试。


感谢您发布此信息。我在派生数据上做了“老派”命令行删除,但问题仍然存在。使用您的方法为我解决了这个问题。
阿德里安

也为我刷新所有观点以赢得胜利。谢谢!
Mike K.

56

我只是删除失败的视图,然后按Command + Z撤消删除。这个对我有用。

如果以后编辑失败的视图,则可能再次发生错误,请再次执行上述操作。


6
它很荒谬,但是有效。
安萨里

1
太棒了!! 为我工作
Nupur Sharma,

1
谁知道这可能是答案。我仍然不敢相信它奏效了
阿萨德·阿莫迪

37

我在CocoaPod 1.5.0中遇到了这个问题。解决方案是,一旦出现此错误,请重新安装pod(再次安装pod),否则您可以使用CocoaPod 1.4.0。它在1.4.0中正常工作(至少对我而言)。

更新:

在Podfile中添加以下脚本可帮助我解决1.5.0中的问题

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings.delete('CODE_SIGNING_ALLOWED')
    config.build_settings.delete('CODE_SIGNING_REQUIRED')
  end
end

参考:https : //github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911


100%正确。降级到1.4.0为我解决了这个问题。
ale_stro

4
可以使用1.5.0荚。
安德烈·奥谢夫

3
s work for me, you should add 结束到代码的最后。
马赫迪

1
也为我工作。尝试了所有其他建议,但均未成功。带豆荚1.3.1进行测试
萨尔

18

将以下代码添加到我的@IBDesignable课程中就可以了。

override init(frame: CGRect) {
    super.init(frame: frame)
}

这对我有用。实际上,我添加了两个覆盖扩展UITextView。(1)init(frame: CGRect, textContainer: NSTextContainer?),(2)init?(coder aDecoder: NSCoder)。然后重建并警告(错误)消失了。甚至不需要清理构建文件夹。

谢谢!好的答案)
JiosDev

13

对于找不到我的IBDesignablesAgentCocoaTouch文件的任何人(例如我),或者尝试从编辑器“调试选定的视图”时遇到错误,这是调试那些“无法渲染”错误的另一种方法。

打开“控制台”应用程序,从边栏中选择您当前的Mac(默认情况下可能会自动选择它),然后在搜索栏上搜索“ IBSceneUpdate”,然后按Enter。

这样,每次遇到IBDesignable无法渲染的Xcode错误时,您还将获得一个新的“ IBSceneUpdate”条目,其中包含有关该错误的更多详细信息。

至少这是我调试IBDesignable错误的方法!

控制台应用程序显示IBSceneUpdate错误


1
该应用程序是实际的控制台,而不是FYI的终端机。
卡尔·厄普顿

接得好!编辑了我的答案。
Stelabouras

11

如果您将xib文件用于自定义uiview。试试这个:

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

至:

let bundle = Bundle(for: UserView.self) 
bundle.loadNibNamed("UserView", owner: self, options: nil)

8

尝试对可能用于情节提要中的自定义视图的任何xib文件禁用“使用特征变化”(“身份和类型”面板)。


7

我的问题通过从派生数据文件夹中删除文件夹(与该项目有关)来解决。您可以通过以下方法执行此操作:单击文件->项目设置->然后单击箭头符号deside /Users/.../Xcode/DerivedData单击DerivedData文件夹,您将看到名为文件夹的项目将其删除。退出xcode,打开您的项目,使用Product-> clean步骤清洁项目,然后构建项目:Product-> Build这些将解决此问题。


4

@Maria提供的正确答案

在以下位置查看崩溃报告 ~/Library/Logs/DiagnosticReports

替代方法

  1. 打开 Spotlight

在此处输入图片说明

  1. 类型 console.app

在此处输入图片说明

  1. 选择 Crash reports

在此处输入图片说明

  1. 检查一个IBDesignablesAgent-iOS并查看崩溃日志

使用控制台可以帮助我解决问题。比Xcode中的消息详细得多。
Andrew Moore



2

当我调试它时,我发现有一些类正在修改UI。通常,marquelabel是UILabel的子类,或者是UIView的任何其他子类,并在运行时绘制ui并与Autolayout引擎冲突。尝试为这些自定义视图提供固定的宽度或高度。如果仍不能解决您的问题,请尝试以下解决方案:-

解决方案1: -在Pod文件中取消注释#use_frameworks。

解决方案2: -尝试删除派生数据

  1. 关闭Xcode的Editor窗口并退出模拟器->
  2. 转到Xcode首选项->位置->
  3. 单击灰色小箭头,显示派生数据路径->
  4. 选择您的项目->
  5. 删除里面的所有文件夹->
  6. 退出Xcode并重新打开

1
您能否详细说明这实际上是如何解决问题的?
Paula Hasstenteufel

这解决了问题,但仍然不知道为什么use_frameworks没用,因为那对快速项目是正确的
Abhishek

我的Podfile已经在使用框架,过去有什么建议吗?
mmr118

@ moni15我添加了另一种可能的解决方案。请检查。
Ashish Pisey

在Pod文件中取消注释#use_frameworks并清除DerivedData对我有用。
Jugal Desai

2

我遇到了同样的问题,来到这里试图弄清楚发生了什么。我注意到评分最高的答案,而且答案本身也无济于事,因为IBDesignable不存在于日志文件夹中,并且我已经尝试了所有其他选项,但是在注释中,我注意到有人在谈论框架初始化。

我决定尝试注释掉我的UIView的IBDesignable扩展,它立即解决了该问题。因此,要解决此问题,请查找引起问题的扩展,并通过创建IBDesignable类并提供所需的初始化程序,确保设置所需的init,如下所示:

@IBDesignable class RoundedView: UIView {

override init(frame: CGRect) {
    super.init(frame: frame)
    sharedInit()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    sharedInit()
}

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    sharedInit()
}

func sharedInit() {
}
}

重要提示:请记住将新类添加到正在使用可设计项的项目中。


1
如其文档所述,不要忘记在prepareForInterfaceBuilder()的实现中调用super.prepareForInterfaceBuilder()。
Jaime S

1

面临相同的错误:使用自定义的UITextField并使用界面生成器后,控制台中的错误是-对类“ CustomField”使用未实现的初始化程序“ init(frame :)”

添加了初始化程序以修复错误


1

更新到最新的XCode版本后,我遇到了这个问题。尝试了上述多种解决方案后,我只使用Xcode,然后关闭系统并打开它,这对我来说很有效。


0

进行必要的更改后,更改情节提要或在我的情况下更改为.xib,以在“ XCode 7”中打开并保存并关闭。这只是解决错误的一种制止措施,但最终您将需要修复它们或执行此操作,直到无法再解决为止。


0

就我而言,我使用的是一个子类化的库UIView。它正在使用IB_DESIGNABLE,并且缺少对的呼叫[super awakeFromNib]。将调用添加到此方法后,该错误消失了。

我不确定它正在实施的事实是否会对此IB_DESIGNABLE产生影响。


您在哪里添加了[super awakeFromNib]的代码?可以分享您的代码吗?
TheJeff

0

这对我来说是最简单的方法:将此脚本添加到您的 Podfile

Podfile:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    next if target.product_type == "com.apple.product-type.bundle"
    target.build_configurations.each do |config|
      config.build_settings['CONFIGURATION_BUILD_DIR'] = '$PODS_CONFIGURATION_BUILD_DIR'
    end
  end
end

资源:

@IBDesignable的此解决方法可在以下位置找到:https : //github.com/CocoaPods/CocoaPods/issues/5334

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.