我最近升级到Xcode 8,我遇到了故事板的问题。
如果我打开项目并且我没有打开Storyboard,它将编译并运行得很好。一旦我打开故事板,我就会收到有关IB Designables的多个错误,如下所示。
这些视图是使用我使用Cocoapods导入的TextFieldEffects
和BEMCheckbox
的自定义视图的唯一视图。
您可以尝试以下方法之一来找出原因:
IBDesignablesAgentCocoaTouch
日志:~/Library/Logs/DiagnosticReports
并查看原因。@IBDesignable UIView
时,转到编辑器 - >调试所选视图,然后查看堆栈跟踪。Xcode Preference -> Location -> Derived Data
/Users/YourMacName/Library/Developer/Xcode/DerivedData
+ Shift
+ Command
+ Alt
。K
+ Command
。我遇到了同样的问题,来到这里试图弄清楚发生了什么。我注意到最受欢迎的答案,答案本身并没有帮助我,因为IBDesignable不存在于日志文件夹中,我已经尝试了所有其他选项,但是在评论中我注意到有人在谈论帧初始化。
我决定尝试为UIView评论我的IBDesignable扩展,它立即修复了问题。因此,要解决此问题,请找到导致问题的扩展,并确保通过创建IBDesignable类并提供所需的初始化程序来设置所需的初始化,如下所示:
override init(frame: CGRect) {
super.init(frame: frame)
}
重要提示:请记住将新类添加到您正在使用可设计项目的项目中。
我试过干净并运行该项目不会解决这个问题。
但关闭并重新打开了项目。
在进行必要的更改后,更改故事板或在我的情况下更改.xib以在“XCode 7”中打开,保存并关闭。这只是一个解决错误的止损措施,但最终你需要修复它们或直到你不再能够这样做。
就我而言,我使用的是一个子类化@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() {
}
}
的库。它使用UIView
,并且缺少对IB_DESIGNABLE
的调用。一旦我添加了对此方法的调用,bug就消失了。
我不确定它实施[super awakeFromNib]
的事实是否对此有影响。
对于像我这样的人 - 无法找到IB_DESIGNABLE
文件或者在编辑器中尝试“调试所选视图”时出现错误,这是调试那些“无法渲染”错误的另一种方法。
打开“终端”应用程序,从侧栏选择当前的Mac(默认情况下可能会自动选择),然后在搜索栏中搜索“IBSceneUpdate”并按Enter键。每当您收到IBDesignable无法呈现的Xcode错误时,您还将获得一个新的“IBSceneUpdate”条目,其中包含有关错误的更多详细信息。至少我是如何调试我的IBDesignablesAgentCocoaTouch
错误的!
IBDesignable
面对相同的错误:已经定制了UITextField并使用了界面构建器,控制台中的错误是 - 使用未实现的初始化程序'init(frame :)'用于类“CustomField”
添加了初始化程序以修复错误
我通过执行以下操作解决了问题:
B
。File > Workspace settings
文件夹的位置打开Finder应用程序。DerivedData
文件夹,删除与项目对应的文件夹。DerivedData
。更新
有时只是直接去Editor > Refresh all views
工作。如果禁用Editor > Refresh all views
,请退出Xcode并再试一次。
我只是删除失败的视图,然后按命令+ Z撤消删除。这个对我有用。
如果稍后编辑失败的视图,可能会再次出现错误,请再次执行上述操作。
我在CocoaPod 1.5.0中遇到了这个问题。解决方案是在显示此错误后再次重新安装pod(再次安装pod),或者您可以使用CocoaPod 1.4.0。它在1.4.0中工作正常(至少对我而言)。
更新:
在Podfile中添加以下脚本帮助我解决1.5.0中的问题
Refresh all views
参考: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
尝试为您的故事板中使用的自定义视图可能具有的任何xib文件禁用“使用特征变体”(“标识和类型”面板)。
将以下代码添加到我的https://github.com/Skyscanner/SkyFloatingLabelTextField/issues/201#issuecomment-381915911类中就可以了。
@IBDesignable
通过从派生数据文件夹中删除文件夹(与此项目相关)解决了我的问题。您可以通过单击文件 - >项目设置 - >然后单击箭头标志deside /Users/.../Xcode/DerivedData单击DerivedData文件夹,您将看到您的项目命名文件夹删除那些。退出xcode打开你的项目,使用这一步清理项目Product-> clean然后构建项目:Product-> Build这些将解决这个问题。
当我调试这个时,我发现有一些类正在修改UI。通常marquelabel是UILabel的子类或任何其他类的子类UIView并在运行时绘制ui并与Autolayout引擎冲突。尝试为这些自定义视图指定固定宽度或高度。如果它无法解决您的问题请尝试以下解决方案: -
解决方案1: - 在pod文件中取消注释#use_frameworks。
解决方案2: - 尝试删除派生数据
只需打开故事板 - >编辑器 - >刷新所有视图。这对我有用。