2016-08-29 20 views
0

IBInspectableを使用して、ビューに罫線を追加しようとしています。EXC_BAD_ACCESS IBInspectableを使用する

extension UIView { 

    private func getBorder(integer: Int) -> UIRectEdge { 
     if integer == 1 { 
      return .top 
     } else if integer == 2 { 
      return .left 
     } else if integer == 3 { 
      return .right 
     } else if integer == 4 { 
      return .bottom 
     } 
     return .all 

    } 

    @IBInspectable var border: Int? { 
     get { 
      return self.border 
     } 
     set (value) { 
      self.border = value 
      for v in addBorder(edges: self.getBorder(integer: self.border!)) { 
       self.addSubview(v) 
      } 
     } 
    } 

    @IBInspectable var borderColor: UIColor? { 
     get { 
      return self.borderColor 
     } 
     set (value) { 
      self.borderColor = value //EXC_BAD_ACCESS here 
      for v in addBorder(edges: self.getBorder(integer: self.border!), color: borderColor!) { 
       self.addSubview(v) 
      } 
     } 
    } 

    private func addBorder(edges: UIRectEdge, color: UIColor = UIColor.white, thickness: CGFloat = 1) -> [UIView] { 
     ... 
    } 
} 

クラッシュ(borderColorsetで)行self.borderColor = valueで起こります。

デバッグログに表示されるのは、すべて(lldb)です。クラッシュ自体は言う:

スレッド1:ここではEXC_BAD_ACCESS(コード= 2、アドレス= 0x7fff53cc5fe8)

が私の絵コンテです:

storyboard

私はこの問題をどのように修正することができます?ありがとう!

答えて

1

クラッシュを引き起こしている無限の再帰があります。基本的には、borderColorのセッターの中で同じプロパティのためにセッターを呼び出しているため、無限の再帰が行われます。スウィフトは、あなたの財産のためのバックストアを生成しないように、クラスの拡張ではなく、それが計算されたプロパティのようにそれを扱い、あなたがプロパティを設定しようとしたときにセッターを呼び出し、プロパティを格納していることが許可されていないので、

これが起こります。

あり、私はあなたの問題を解決することを、この時点で考えることができる2つのソリューションです:

  1. サブクラスUIViewのは、そこに2つのプロパティを追加し、新しいの名前を一致させるためにIBでクラスを更新クラス。
  2. ダイレクトiVarリファレンスではなく、UIViewアクセサ(objc_setAssociatedObject()/objc_getAssociatedObject())の関連オブジェクトを使用してください。サブクラス化やxibの更新は必要ありませんが、このソリューションは最初のものより少し難解です。