Remove unnecessary views from Nib view hierarchies
NBJMergeLayout is a view that, when added to a view, adds all of its subviews to that view and removes itself.
The power of the NBJMergeLayout
view comes when it's used as the root view in a Nib and that Nib is loaded as the root view of a custom view or control (see NJBNibBasedView for an easy way to do that). In this case it removes an unnecessary view from the resulting view hierarchy.
When the NBJMergeLayout
view is added to a view (didMoveToSuperview
for UIKit and viewDidMoveToSuperview
for AppKit) it does three things:
- It reassigns all of its own Autolayout constraints to the superview, changing any references for itself to the superview.
- It reassigns all of its subviews to the superview.
- It removes itself from the superview.
The end result is all of the NBJMergeLayout
view's subviews are subviews of the view it was attached to, with the same constraints they had before (but now referencing their new superview), and the NBJMergeLayout
view is no longer part of the view hierarchy.
NBJMergeLayout
will update any IBOutlets in its superview that reference any of its constraints. This is needed because new constraints are created during the reassignment step described above. This covers almost any case in which you would normally use NBJMergeLayout
. Any other IBOutlets that reference these constraints will not be updated.