2016-08-29 3 views
0

Ich versuche IBInspectable zu verwenden, um Grenzen zu meinen Ansichten hinzuzufügen.EXC_BAD_ACCESS Verwendung von 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] { 
     ... 
    } 
} 

Der Absturz tritt auf der Linie self.borderColor = value (im set für die borderColor).

Alles, was es im Debug-Protokoll sagt, ist (lldb). Der Absturz selbst sagt:

Gewinde 1: EXC_BAD_ACCESS (code = 2, Adresse = 0x7fff53cc5fe8)

Hier mein Storyboard ist:

storyboard

Wie kann ich dieses Problem zu beheben ? Vielen Dank!

Antwort

1

Sie haben dort eine unendliche Rekursion, die den Absturz verursacht. Grundsätzlich rufen Sie im Setter von borderColor den Setter für die gleiche Eigenschaft auf, was zu der unendlichen Rekursion führt.

Dies passiert, weil Klassenerweiterungen keine gespeicherten Eigenschaften haben dürfen. Daher generiert Swift keinen Backstore für Ihre Eigenschaft, sondern behandelt sie wie eine berechnete Eigenschaft und ruft den Setter auf, wenn Sie versuchen, die Eigenschaft festzulegen.

Es gibt zwei Lösungen, die ich in dieser Zeit denken können, dass Ihr Problem lösen: es

  1. Subclass UIView, fügen die beiden Eigenschaften, aktualisieren Sie die Klasse in IB den Namen Ihres neuen anzupassen Klasse.
  2. Verwenden Sie zugeordnete Objekte in Ihrem UIView Accessoren (objc_setAssociatedObject()/objc_getAssociatedObject()) anstelle von direkten iVar-Referenz. Sie müssen Ihre XIBs nicht unterklassifizieren und aktualisieren, aber diese Lösung ist ein bisschen unordentlicher als die erste.
Verwandte Themen