【问题标题】:Swift Class Variable Crashing Interface Builder Live RenderingSwift 类变量崩溃界面生成器实时渲染
【发布时间】:2015-03-26 21:11:08
【问题描述】:

在 Swift 中,我通过子类化 UIView 创建了一个自定义视图:

@IBDesignable class HandView: UIView {

var view:UIView!
var settings:AppSettings?

@IBOutlet weak var c1ImageView: UIImageView!
@IBInspectable var c1Image:UIImage? { didSet { self.c1ImageView?.image = self.c1Image } }

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    //self.settings = AppSettings.sharedInstance
    self.xibSetup()
  }
}

当我将此视图添加到我的故事板时,实时渲染按预期工作。一旦我取消注释该行:

//self.settings = AppSettings.sharedInstance

实时渲染崩溃 - 我收到以下错误消息:

error: IB Designables: Failed to render instance of BetView: Rendering the view took 
error: IB Designables: Failed to render instance of HandView: The designables agent 
crashed

应用程序按应有的方式编译和运行。唯一受影响的是实时渲染。 AppSettings 类是一个单例:

class AppSettings {

//This makes AppSettings a singleton
class var sharedInstance: AppSettings {
    struct Static {
        static let instance: AppSettings = AppSettings()
    }
    return Static.instance
}

private let settings = NSUserDefaults.standardUserDefaults()

init () {
    //Load default values from the plist file
    let settingsBundleURL = NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
    let settingsDefaults = NSDictionary (contentsOfFile: settingsBundleURL!)
    self.settings.registerDefaults(settingsDefaults!)
}

我不确定它为什么会窒息或该怎么办。我不想停止使用实时渲染,因为它对开发我的项目非常有用。

【问题讨论】:

    标签: ios swift rendering


    【解决方案1】:

    您需要在 HandView 中覆盖 init(frame: CGRect)

    override init(frame: CGRect) {
            super.init(frame: frame)
            self.settings = AppSettings.sharedInstance
            self.xibSetup()
    }
    

    并且还修复了 AppSettings 类。这行代码来自 AppSettings init() 方法

    NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
    

    返回可选值。所以在使用前需要通过可选绑定来判断settingsBundleURL是否包含值。

     init () {
        //Load default values from the plist file
        let settingsBundleURL = NSBundle.mainBundle().pathForResource("Defaults", ofType: "plist")
        if let url = settingsBundleURL {
           let settingsDefaults = NSDictionary (contentsOfFile: settingsBundleURL!)
           self.settings.registerDefaults(settingsDefaults!)
        }
     }
    

    【讨论】:

    • 如上所述添加了 init(frame: CGRect) 并且还需要 init (coder aDecoder: NSCoder) 但问题仍然存在。
    猜你喜欢
    • 2011-04-16
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多