Browse Source

Allow install and uninstall to be indempotent

Robert Payne 11 years ago
parent
commit
faf7d43aaf
2 changed files with 35 additions and 6 deletions
  1. 9 6
      Snap/Constraint.swift
  2. 26 0
      SnapTests/SnapTests.swift

+ 9 - 6
Snap/Constraint.swift

@@ -287,11 +287,6 @@ public class Constraint {
     // MARK: internal
     
     internal func installOnView(updateExisting: Bool = false) -> Array<LayoutConstraint> {
-        if self.installedOnView != nil {
-            NSException(name: "Cannot Install Constraint", reason: "Already installed", userInfo: nil).raise()
-            return []
-        }
-        
         var installOnView: View? = nil
         if self.toItem.view != nil {
             installOnView = Constraint.closestCommonSuperviewFromView(self.fromItem.view, toView: self.toItem.view)
@@ -306,13 +301,21 @@ public class Constraint {
                     installOnView = self.fromItem.view
                 }
                 
-                if installedOnView == nil {
+                if installOnView == nil {
                     NSException(name: "Cannot Install Constraint", reason: "Missing superview", userInfo: nil).raise()
                     return []
                 }
             }
         }
         
+        if self.installedOnView != nil {
+            if self.installedOnView != installOnView {
+                NSException(name: "Cannot Install Constraint", reason: "Already installed on different view.", userInfo: nil).raise()
+                return []
+            }
+            return self.installedLayoutConstraints?.allObjects as Array<LayoutConstraint>
+        }
+        
         var newLayoutConstraints = Array<LayoutConstraint>()
         let layoutFromAttributes = self.fromItem.attributes.layoutAttributes
         let layoutToAttributes = self.toItem.attributes.layoutAttributes

+ 26 - 0
SnapTests/SnapTests.swift

@@ -140,4 +140,30 @@ class SnapTests: XCTestCase {
         
     }
     
+    func testReinstallConstraints() {
+        let v1 = UIView()
+        let v2 = UIView()
+        self.container.addSubview(v1)
+        self.container.addSubview(v2)
+        
+        let constraints = v1.snp_prepareConstraints { (make) -> Void in
+            make.edges.equalTo(v2)
+            return
+        }
+        
+        XCTAssertEqual(self.container.constraints().count, 0, "Should have 0 constraints installed")
+        
+        for constraint in constraints {
+            constraint.install()
+        }
+        
+        XCTAssertEqual(self.container.constraints().count, 4, "Should have 4 constraints installed")
+        
+        for constraint in constraints {
+            constraint.install()
+        }
+        
+        XCTAssertEqual(self.container.constraints().count, 4, "Should have 0 constraints installed")
+    }
+    
 }