2015-11-06 71 views
3

我有一個XCode 7.1界面生成器很奇怪的問題。我有一個非常簡單的UIView子類,這使得在故事板編輯罰款:UIView初始化覆蓋導致IBDesignable崩潰

import UIKit 

@IBDesignable 
class DashboardHeaderView: UIView { 

    @IBInspectable 
    var maskClipHeight: CGFloat = 40.0 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     self.setMask() 
    } 

    private func setMask() { 
     let mask = CAShapeLayer() 
     mask.path = self.createMaskPath() 
     self.layer.mask = mask 
    } 

    private func createMaskPath() -> CGPath { 
     let maskPath = UIBezierPath() 
     maskPath.moveToPoint(CGPoint(x: bounds.minX, y: bounds.minY)) 
     maskPath.addLineToPoint(CGPoint(x: bounds.maxX, y: bounds.minY)) 
     maskPath.addLineToPoint(CGPoint(x: bounds.maxX, y: bounds.maxY - self.maskClipHeight)) 
     maskPath.addLineToPoint(CGPoint(x: bounds.minX, y: bounds.maxY)) 
     maskPath.closePath() 

     return maskPath.CGPath 
    } 

} 

但是,如果我只添加初始化覆蓋到它:

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

它失敗,錯誤:

  • 錯誤:IB Designables:無法更新自動佈局狀態:代理程序崩潰
  • er ror:IB Designables:無法呈現DashboardHeaderView的實例:代理程序崩潰

我100%確定初始化器重寫使它崩潰,因爲我已經重現了它幾次。如果我只評論它,它會再次運作。

任何人都有任何想法,爲什麼發生這種情況,如果有辦法修復/解決方法呢?

+0

您是否嘗試過使用'init()'而不使用參數? – Losiowaty

+0

@Losiowaty UIView根本沒有定義'init()',據我所知。而且,如果我理解的很好,界面構建器會使用init和編碼器來初始化View。 –

回答

0

我有過類似的問題,發現在prepareForInterfaceBuilder()函數之外爲ibdesignable視圖設置掩碼會導致呈現崩潰... prepareForInterfaceBuilder()不是由系統調用,只能由interfaceBuilder調用,所以你將需要在這裏和awakeFromNib()中設置maskView。

1

我一直在爲這一整天奮鬥。你需要執行;

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

這是IBDesignable代理程序用於實例化類的初始化過程。所以,在我的情況下,我也有另一個初始化器;

init(frame: CGRect, maxValue: Double, minValue: Double) 
{ 
    super.init(frame: frame) 

    self.maxValue = maxValue 
    self.minValue = minValue 
} 

我的init阻塞了IBDesignable需要的init。一旦我重寫了上面的默認init,我可以選擇將init保持原樣或將其轉換爲便捷的init;

convenience init(frame: CGRect, maxValue: Double, minValue: Double) 
{ 
    self.init(frame: frame) 

    self.maxValue = maxValue 
    self.minValue = minValue 
} 

現在我可以爲IBDesigner添加一些默認行爲;

var initForIB = false; 

init(frame: CGRect, maxValue: Double, minValue: Double) 
{ 
    super.init(frame: frame) 

    self.maxValue = maxValue 
    self.minValue = minValue 
    initForIB = false; 
} 

override init(frame: CGRect) 
{ 
    super.init(frame: frame); 
    initForIB = true 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

override func drawRect(rect: CGRect) 
{ 
    if (initForIB) 
    { 
     initIBDefaults() 
    } 
    ...do some other stuff... 
}